Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
14.05.2014, 20:14     Представление из бит в байт #1
Вообще такая беда как представить биты в то что они были сначала,вот так я представляю байт в битах с помощью маски,а как обратно не знаю
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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,167
Завершенные тесты: 1
14.05.2014, 20:21     Представление из бит в байт #2
C++
1
2
3
byte=0;
for (int j = 0; j < 8;j++){
    byte |= (bit[j]<<j);
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
14.05.2014, 22:19  [ТС]     Представление из бит в байт #3
можете сказать не грамотному что значит |=
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.05.2014, 22:48     Представление из бит в байт #4
Цитата Сообщение от Bdavid008 Посмотреть сообщение
что значит |=
Следующие записи равносильны:
C++
1
2
a |= b; 
a = a | b;
| - операция побитового "или"
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
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++;
 }
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);
                }
прошу чтобы вывел он выдает абсолютно разное
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
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));
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];
                }
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
15.05.2014, 19:08     Представление из бит в байт #9
Теперь прокомментируй каждую строчку
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];
                }
смотрю что получилось
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
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?
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;
                }
вот так должно быть когда я обратно перегоняю но все равно куда-то девается первый элемент остальное нормально
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
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 минуту
в последнем решении есть еще одна принципиальная ошибка
найдешь? или подсказать?
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 минуту
И все равно выдает не то что задано начально
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
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 бит), лучше выделить в отдельную функцию
и только потом работай с массивом
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
15.05.2014, 21:24  [ТС]     Представление из бит в байт #16
а если вам не сложно можете показать как что то я вообще запутался
C++
1
2
3
4
5
6
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;//маска по которой я сравниваю
                    }
вот же я загоняю ,а как обратно не знаю
ValeryS
Модератор
6375 / 4841 / 443
Регистрация: 14.02.2011
Сообщений: 16,044
15.05.2014, 21:48     Представление из бит в байт #17
Цитата Сообщение от Bdavid008 Посмотреть сообщение
C++
1
2
3
4
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;//маска по которой я сравниваю
где k меняется?

в результате все биты ты загоняешь в bit[0]
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
15.05.2014, 21:51  [ТС]     Представление из бит в байт #18
byte & 0x01 ? bit[k] = 1 : bit[k] = 0;//маска по которой я сравниваю
k++; я не вставил походу соррри мой косяк)не внимательность ,простите ,спасибо что обьясняете,просто я дес реалзую и поэтому биты нужны
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.05.2014, 22:03     Представление из бит в байт #19
Смотрю я на все эти битоё... и понимаю, что std::bitset по вам плачет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2014, 22:36     Представление из бит в байт
Еще ссылки по теме:

C++ функция изменяет старший байт числа на заданное значение не изменяя младший байт
C++ Закодировать файл. Взять 7 байт. Первый бит каждого байта переместить в 8 байт
C++ Как сложить два float-а, имея их представление в виде массива байт?

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

Или воспользуйтесь поиском по форуму:
Bdavid008
20 / 20 / 0
Регистрация: 24.03.2014
Сообщений: 77
15.05.2014, 22:36  [ТС]     Представление из бит в байт #20
Понимаешь у меня препод любит оптимизацию )я тут и так с хитрил в массив интовский все загнал , а тут еще подключать библиотеку битсет)
Yandex
Объявления
15.05.2014, 22:36     Представление из бит в байт
Ответ Создать тему
Опции темы

Текущее время: 23:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru