Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Глюк побитной записи?


Автор: kefir01 5.12.2013, 01:14
Добрый день, друзья.

Никак не могу въехать в каком месте я дурак - глядите... Сразу прошу ссаными тряпками в поиск не гнать - похожего не нарыл (честно старался найти похожее)

Есть такой код:
Код

    char test = (char)10110000;   //header B0

    std::bitset<sizeof(char) * CHAR_BIT> binary(test);
    std::cout << binary << std::endl;


Если я записываю переменную test в виде
Код

    char test = 0xB0;   //header B0


то получаю вывод 10110000, что собственно и хочу, однако если записываю в виде (char)10110000 получаю 00110000, что как вы можете понять вообще не айс.

Запись в виде
Код

    char test = 0x10110000;   //header B0


то вообще схватываю четыре нуля. Причем неважно - с (char) или нет.

Автор: volatile 5.12.2013, 01:56
Цитата(kefir01 @  5.12.2013,  01:14 Найти цитируемый пост)
 char test = 0x10110000;   //header B0

0x - это не двоичная запись, а шестнадцатеричная

Автор: feodorv 5.12.2013, 02:46
Цитата(kefir01 @  5.12.2013,  02:14 Найти цитируемый пост)
однако если записываю в виде (char)10110000 получаю 00110000

10110000 - обычное десятеричное число, никак не двоичное. Когда вы делаете (char)10110000, то от этого числа остаются только младшие 8 бит: 
Цитата
10110000 = 0x9a4430
10110000 & 0xff = 0x30
а 0x30 в битовом представлении есть как раз "00110000" (кажется, что старший бит пропал).

Увы, в C/C++ нет двоичного представления констант, но можно пользоваться шестнадцатеричным, как Вы и написали:
Цитата(kefir01 @  5.12.2013,  02:14 Найти цитируемый пост)
char test = 0xB0; 


Автор: kefir01 5.12.2013, 07:28
Все немного не так... На самом деле мне надо записать 20 байт по 8 бит каждый. Не совсем числа - скорее ключи управления...
Принимающая сторона тоже читает больше индивидуальные биты нежели десятеричные числа, которые они образуют.
Совсем забыл упомянуть, что если
Код

char test = 0xB0;   //header B0


То принимающая сторона принимает запрос и в ответе возвращает 10110000, а если я записываю как-либо иначе - нет. Поэтому терять тут ничего нельзя.

А за информацию спасибо, но проблемы это не решает.

Автор: borisbn 5.12.2013, 09:02
Цитата(kefir01 @  5.12.2013,  07:28 Найти цитируемый пост)
но проблемы это не решает

Какой проблемы-то ?

Автор: volatile 5.12.2013, 09:55
Цитата(kefir01 @  5.12.2013,  01:14 Найти цитируемый пост)
 std::bitset<sizeof(char) * CHAR_BIT> binary(test);

kefir01, можно так инициализировать:
Код

std::bitset<CHAR_BIT> binary ("10110000");


вместо тектовой константы, можно и std::string
Код

std::string str = "10110000";
std::bitset <CHAR_BIT> binary (str);


Главное следите, чтобы строка состояла только из нолей и единичек, иначе программа выкинет исключение std::invalid_argument


Автор: feodorv 5.12.2013, 10:54
Цитата(kefir01 @  5.12.2013,  08:28 Найти цитируемый пост)
Поэтому терять тут ничего нельзя.

Так что теряется-то?

Автор: kefir01 5.12.2013, 19:14
volatile, спасибо, в карму плюсанул. Так пишется правильно... Хоть конечно и не хочется пользоваться std для такиех вещей...
Я так еще подумал, что в принципе можно было бы в шестнадцатеричном представлении писать - то есть если у меня скажем есть последовательность типа 01011010, то никто не мешает записать это как 0x59, хотя в таком случае пришлось бы преобразования делать...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)