27 / 27 / 0
Регистрация: 24.03.2014
Сообщений: 77
1

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

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

Author24 — интернет-сервис помощи студентам
Вообще такая беда как представить биты в то что они были сначала,вот так я представляю байт в битах с помощью маски,а как обратно не знаю
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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2014, 20:14
Ответы с готовыми решениями:

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

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

Массив байт в бит
Есть массив байт. Как быстро считать в бит и вывести в RichEdit?

8 бит собрать в 1 байт
Помогите собрать в один байт 8 знаков что то не получается, в делфи работает в с++ билдере не...

24
Модератор
Эксперт С++
13502 / 10754 / 6409
Регистрация: 18.12.2011
Сообщений: 28,700
14.05.2014, 20:21 2
C++
1
2
3
byte=0;
for (int j = 0; j < 8;j++){
    byte |= (bit[j]<<j);
1
27 / 27 / 0
Регистрация: 24.03.2014
Сообщений: 77
14.05.2014, 22:19  [ТС] 3
можете сказать не грамотному что значит |=
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.05.2014, 22:48 4
Цитата Сообщение от Bdavid008 Посмотреть сообщение
что значит |=
Следующие записи равносильны:
C++
1
2
a |= b; 
a = a | b;
| - операция побитового "или"
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
14.05.2014, 23:10 5
Лучший ответ Сообщение было отмечено Bdavid008 как решение

Решение

для разнообразия мог предложить такой вариант
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
27 / 27 / 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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
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
27 / 27 / 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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
15.05.2014, 19:08 9
Теперь прокомментируй каждую строчку
1
27 / 27 / 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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
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
27 / 27 / 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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
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
27 / 27 / 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
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
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
27 / 27 / 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;//маска по которой я сравниваю
                    }
вот же я загоняю ,а как обратно не знаю
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,516
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]
0
27 / 27 / 0
Регистрация: 24.03.2014
Сообщений: 77
15.05.2014, 21:51  [ТС] 18
byte & 0x01 ? bit[k] = 1 : bit[k] = 0;//маска по которой я сравниваю
k++; я не вставил походу соррри мой косяк)не внимательность ,простите ,спасибо что обьясняете,просто я дес реалзую и поэтому биты нужны
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.05.2014, 22:03 19
Смотрю я на все эти битоё... и понимаю, что std::bitset по вам плачет.
0
27 / 27 / 0
Регистрация: 24.03.2014
Сообщений: 77
15.05.2014, 22:36  [ТС] 20
Понимаешь у меня препод любит оптимизацию )я тут и так с хитрил в массив интовский все загнал , а тут еще подключать библиотеку битсет)
0
15.05.2014, 22:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2014, 22:36
Помогаю со студенческими работами здесь

Конвертирование бит в байт
Как можно из бит получить байт к примеру из 11111111 получит 255 есть ли какая нибудь функция?

Ребуса БИТ+БАЙТ=СЛОВО
Помогите до увести до ума задачу по решению ребуса. БИТ+БАЙТ=СЛОВО, должно получиться 9 2,3 7+9 5...

Считать Бит/Байт из файла!
Здравствуйте.Прошу помощи или совета. Необходимо считать некоторый бит файла и байт. (есть файл,...

Конвертация массива бит в массив байт
Есть ли в Java стандартные функции для конвертации массива бит в массив байт? При этом, что бы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru