Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
#1

Представление из бит в байт - C++

14.05.2014, 20:14. Просмотров 900. Ответов 24
Метки нет (Все метки)

Вообще такая беда как представить биты в то что они были сначала,вот так я представляю байт в битах с помощью маски,а как обратно не знаю
C++
1
2
3
4
5
6
7
 for (int i = 0; i < N; i++){
 
                    for (int j = 0, byte = buf[i]; j < 8; byte <<= 1, j++){
 
                        byte & 0x80 ? bit[k] = 1 : bit[k] = 0;
                        k++;
                    }
1
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.05.2014, 20:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Представление из бит в байт (C++):

Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт - C++
Нужно открыть бинарный файл и закодировать следующим образом. Взять 7 байт. Первый бит каждого байта переместить в 8 байт. То есть,...

Порядок байт в слове и бит в байте - C++
читал эту требуются пояснения. A B C D - адреса в них число 128 BE A B C D ...

Как сложить два float-а, имея их представление в виде массива байт? - C++
Здравствуйте. Нужна помощь. Я храню float числа в виде массива 4-х байтов. Подскажите как не переводя массив обратно во float,...

Бит 8, младший и старший бит (по книге) - C++
Добрый день. Вот читаю книгу, и не пойму элементарной на первый взгляд вещи. Как понять следующие предложения: 1) Если бит...

функция изменяет старший байт числа на заданное значение не изменяя младший байт - C++
функция изменяет старший байт числа на заданное значение не изменяя младший байт. как можно проще

Посчитать в файле количество нулевых байт и различных байт - C++
Посчитать в файле кол-во нулевых байт и различных байт Кто решит буду весьма благодарен!:drink:

24
zss
Модератор
Эксперт С++
6530 / 6092 / 2007
Регистрация: 18.12.2011
Сообщений: 15,842
Завершенные тесты: 1
14.05.2014, 20:21 #2
C++
1
2
3
byte=0;
for (int j = 0; j < 8;j++){
    byte |= (bit[j]<<j);
1
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
14.05.2014, 22:19  [ТС] #3
можете сказать не грамотному что значит |=
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.05.2014, 22:48 #4
Цитата Сообщение от Bdavid008 Посмотреть сообщение
что значит |=
Следующие записи равносильны:
C++
1
2
a |= b; 
a = a | b;
| - операция побитового "или"
1
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,188
14.05.2014, 23:10 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
для разнообразия мог предложить такой вариант
C++
1
2
3
4
unsigned char MyByte=0;
for( unsigned char i=0,j=1;j;i++,j*=2)
 if(MyBit[i])
   MyByte|=j;
тоже самое без условия
C++
1
2
3
unsigned char MyByte=0;
for( unsigned char i=0,j=1;j;i++,j=j<<1)
    MyByte|=j*MyBit[i];
прикол в том что при достижении j значения 0х80 при следующем умножении( сдвиг влево) произойдет переполнение разрядной сетки и там будет 0

пользоваться именами byte и bit не рекомендую
в некоторых диалектах это типы
byte чаще всего это unsigned char
а bit в микроконтроллерах это действительно бит, эти диалекты как и процессоры позволяют работать с отдельными битами

Добавлено через 7 минут
Цитата Сообщение от Bdavid008 Посмотреть сообщение
C++
1
2
3
4
5
6
7
for (int i = 0; i < N; i++){
 
 for (int j = 0, byte = buf[i]; j < 8; byte <<= 1, j++){
 
 byte & 0x80 ? bit[k] = 1 : bit[k] = 0;
 k++;
 }
здесь закралась одна маленькая ошибка, которая может испортить все
дело в том, что старший бит 0x80 записывается в младший элемент массива
поправить можно хотя бы так
C++
1
2
3
4
5
6
7
for (int i = 0; i < N; i++){
 
 for (int j = 0, byte = buf[i]; j < 8; byte >>= 1, j++){
 
 byte & 0x01? bit[k] = 1 : bit[k] = 0;
 k++;
 }
при этом можно вообще обойтись без условия
C++
1
2
3
4
5
6
7
for (int i = 0; i < N; i++){
 
 for (int j = 0, byte = buf[i]; j < 8; byte >>= 1, j++){
 
  bit[k] = byte & 0x01;
 k++;
 }
1
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
15.05.2014, 00:39  [ТС] #6
у меня вообще массив чаровский потому что fin.read(buf, sizeof(buf)); read не принимает ансигнет чар,что не работает как я хочу, могу весь код скинуть const int N = 8;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
    char buf[N];
    int i;
    ifstream fin(a, ios::binary);
    if (!fin)
        cout << "Error!" << endl;
    else
    {
        ofstream fout("des", ios::binary);
        while (true)
        {
            fin.read(buf, sizeof(buf));
            if (!fin.gcount())
                break;
 
            if (fin.gcount() != sizeof(buf))
            {
                int n = sizeof(buf)-fin.gcount();
                cout << n << endl;
            }
            {   
                const int NUM = 64;
                int sampel[NUM];
                int bit[NUM];
                int k = 1;
                for (int i = 0; i < N; i++){
 
                    for (int j = 0, byte = buf[i]; j < 8; byte <<= 1, j++){//перетаскивание 
                        byte & 0x01  ? bit[k] = 1 : bit[k] = 0;
                        k++;
                        
                    }
                    }
                
                char byte = 0;
                for (int j = 0; j < 8; j++){
                    byte |= (bit[j] << j);
                }
прошу чтобы вывел он выдает абсолютно разное
1
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,188
15.05.2014, 00:49 #7
Цитата Сообщение от Bdavid008 Посмотреть сообщение
у меня вообще массив чаровский потому что fin.read(buf, sizeof(buf)); read не принимает ансигнет чар
приведение типов? слышал такое?
C++
1
2
3
unsigned char buf[N];
............
fin.read((char )buf, sizeof(buf));
1
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
15.05.2014, 18:53  [ТС] #8
fin.read((char*) buf, sizeof(buf));я сделал так ,но все равно разно выдает

Добавлено через 7 минут
точнее когда перевожу обратно с бит в байт выдает разное

Добавлено через 17 часов 49 минут
Сделал как вы сказали не помогло
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
for (int i = 0; i < N; i++){
                    for (int j = 0, byte = buf[i]; j < 8; byte >>= 1, j++){
 
                        byte & 0x01 ? bit[k] = 1 : bit[k] = 0;
                    }
                    
                    }
                for (i = 0; i < 8; i++){
                    cout << buf[i];
                }
                cout << endl;
 
                for (i = 0; i < 8;i++ )
                for (int j = 8; j > 0; j--){
                    buf[i] |= (bit[j] << j);
                }
 
                for (i = 0; i < 8; i++){
                    cout<<buf[i];
                }
1
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,188
15.05.2014, 19:08 #9
Теперь прокомментируй каждую строчку
1
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
15.05.2014, 19:14  [ТС] #10
C++
1
2
3
4
5
for (int i = 0; i < N; i++){
                    for (int j = 0, byte = buf[i]; j < 8; byte >>= 1, j++){
 
                        byte & 0x01 ? bit[k] = 1 : bit[k] = 0;
                    }
тут помошью маски записываю в массив интовский
C++
1
2
3
4
for (i = 0; i < 8; i++){
                    cout << buf[i];
                }
                cout << endl;
тут для сравнения вывожу не измененый массив
C++
1
2
3
4
 for (i = 0; i < 8;i++ )
                for (int j = 8; j > 0; j--){
                    buf[i] |= (bit[j] << j);
                }
тут с того интовского массива где я получил набор единиц и нулей снова засовываю
C++
1
2
3
for (i = 0; i < 8; i++){
                    cout<<buf[i];
                }
смотрю что получилось
0
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,188
15.05.2014, 19:29 #11
Цитата Сообщение от Bdavid008 Посмотреть сообщение
тут для сравнения вывожу не измененый массив
в смысле исходный?
Цитата Сообщение от Bdavid008 Посмотреть сообщение
buf[i] |= (bit[j] << j);
пред записью в buf[i] чистить его нужно(записать 0)
Цитата Сообщение от Bdavid008 Посмотреть сообщение
C++
1
2
3
4
for (int j = 0, byte = buf[i]; j < 8; byte >>= 1, j++){
 
                        byte & 0x01 ? bit[k] = 1 : bit[k] = 0;
                    }
что заk где оно меняется? у тебя цикл по j
почему я и попросил прокомментировать каждую строчку, тогда бы ты заметил что то о чем думаешь и что исполняет программа это несколько разные вещи
далее как объявлен byte?
1
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
15.05.2014, 19:56  [ТС] #12
ксттати я там на касипорил с циклами вот так должно быть
C++
1
2
3
4
5
6
7
8
9
i = 8;
                k = 0;
                for (int j =0; j < 8; j++){
                    for (k; k < i; k++){
                        buf[j] |= (bit[k] << k);
                    }
                    i = i + 8;
                    k = k + 8;
                }
вот так должно быть когда я обратно перегоняю но все равно куда-то девается первый элемент остальное нормально
1
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,188
15.05.2014, 20:09 #13
Цитата Сообщение от Bdavid008 Посмотреть сообщение
for (int j =0; j < 8; j++){
for (k; k < i; k++){
buf[j] |= (bit[k] << k);
}
i = i + 8;
k = k + 8;
теперь смотри
перед первым циклом k равна 0
потом после отработки цикла for (k; k < i; k++) k=8
далее
i = i + 8; 8+8=16
k = k + 8; 8+8=16
второй раз цикл не исполнится k < i 16 < 16 ложь
следовательно строчку k = k + 8 выбрось

и открой для себя отладчик
пару раз пройдешь пошагово и найдешь ошибки

Добавлено через 1 минуту
в последнем решении есть еще одна принципиальная ошибка
найдешь? или подсказать?
1
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
15.05.2014, 20:49  [ТС] #14
все равно не работает ,я уже не знаю что делать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
const int NUM = 64;//массив из 64 элементов
                //int sampel[NUM];
                int bit[NUM];//собственно этот массив где храняться биты
                int k = 0;//счетчик по которому я добавляю элементы в массив bit
                for (int i = 0; i < N; i++){//внешний цикл по которому иду по массиву buf 
                    for (int j = 0, byte = buf[i]; j < 8; byte >>= 1, j++){//цикл из восьми элементов,дабы по истечению этого цикла идти к другой переменной массива buf
                        byte & 0x01 ? bit[k] = 1 : bit[k] = 0;//маска по которой я сравниваю
                    }
                    
                    }
                for (i = 0; i < 8; i++){//вывожу исходный   ,чтобы сравнить с полученным
                    cout << buf[i];
                }
                cout << endl;
                
                
                for (int i = 0; i < N; i++)
                {
                    buf[i] = 0;//обнуляю как вы сказали
                }
                i = 8;//так как массив из 64 элементов
                k = 0;//я бью его на блоки
                for (int j = 0; j < N; j++){//цикл по которому я я иду для заполнения элементов
                    for (k; k < i; k++){//иду по циклу состоящиму из 64 элементов
                        buf[j] |= (bit[k] << k);//но тут сдвигаю
                    }
                    i = i + 8;//тут беру следуюший блок
                    k = k + 8;//у меня на первой итерации идет с 0 по 7 на второй с 8 по 15 и так далее
                }
 
                for (i = 0; i < 8; i++){
                    cout<<buf[i];//вывожу полученный после всех этих замен
                }
                cout << endl;
                system("PAUSE");
Добавлено через 1 минуту
да я уже вообще не знаю,подскажите пожалуйста

Добавлено через 1 минуту
так у меня же идет k=0 далее k+8 то есть k=8 а i = 8 ;i+8=16

Добавлено через 1 минуту
а понял кажись оно же во время цикла увеличивается на 8 ,вот я ....

Добавлено через 1 минуту
И все равно выдает не то что задано начально
1
ValeryS
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,188
15.05.2014, 21:08 #15
Цитата Сообщение от Bdavid008 Посмотреть сообщение
const int NUM = 64;
Цитата Сообщение от Bdavid008 Посмотреть сообщение
int bit[NUM];
64 бита соответственно 8 байт
Цитата Сообщение от Bdavid008 Посмотреть сообщение
for (int i = 0; i < N; i++)
цикл крутится 64 раза
Цитата Сообщение от Bdavid008 Посмотреть сообщение
for (int j = 0, byte = buf[i];
соответственно размер buf 64 байта= 512 бит!!!!
разберись с размерностью, запутался в битах и байтах
для начала попробуй перевести 1 байт( 8 бит), лучше выделить в отдельную функцию
и только потом работай с массивом
1
15.05.2014, 21:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2014, 21:08
Привет! Вот еще темы с ответами:

Для целого числа А выделить старший байт и поставить его на место младшего байта. старший байт при этом обнулить. - C++
Помогите пожалуйста, вообще не могу понять как делать следующее...Еще и в программе CODE BLOCKS препод почему именно эту программу...

переход с 32 бит на 64 бит - C++
Здравствуйте. Пробую на builder 10 перевести проект с 32 на 64 бит. Возникают странные ошибки: template &lt;typename T&gt; class DOT { ...

Инверсия бит - C++
Добрый день. Есть unsigned short int x; Нужно инверсировать все биты в x, например, если x=1001001101 (589), то нужно чтобы...

Старший бит - C++
Допустим число 4 представляю в двоичной системе счисления получается 0100. В етом двоичном числе старший бит ет 3 бит?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru