Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глюк побитной записи? 
V
    Опции темы
kefir01
Дата 5.12.2013, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



Добрый день, друзья.

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

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

    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) или нет.

Это сообщение отредактировал(а) kefir01 - 5.12.2013, 01:14
PM MAIL   Вверх
volatile
Дата 5.12.2013, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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

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

PM MAIL   Вверх
feodorv
Дата 5.12.2013, 02:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(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; 




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
kefir01
Дата 5.12.2013, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



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

char test = 0xB0;   //header B0


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

А за информацию спасибо, но проблемы это не решает.
PM MAIL   Вверх
borisbn
Дата 5.12.2013, 09:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 5.12.2013, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(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


PM MAIL   Вверх
feodorv
Дата 5.12.2013, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



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

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
kefir01
Дата 5.12.2013, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: нет
Всего: 2



volatile, спасибо, в карму плюсанул. Так пишется правильно... Хоть конечно и не хочется пользоваться std для такиех вещей...
Я так еще подумал, что в принципе можно было бы в шестнадцатеричном представлении писать - то есть если у меня скажем есть последовательность типа 01011010, то никто не мешает записать это как 0x59, хотя в таком случае пришлось бы преобразования делать...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0672 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.