Установить цифру шестнадцатеричного числа - PullRequest
5 голосов
/ 14 мая 2011

Как мне установить цифру в шестнадцатеричном числе? У меня сейчас есть этот код:

int row = 0x00000000;
row |= 0x3 << 8;
row |= 0x2 << 4;
row |= 0x1 << 0;

printf("Row: 0x%08x", row);

Который работает отлично, если "строка" - это просто нули. Как только я изменю это на что-то вроде этого:

int row = 0x33333333;
row |= 0x3 << 8;
row |= 0x2 << 4;
row |= 0x1 << 0;

printf("Row: 0x%08x", row);

Я просто получаю этот вывод:

Строка: 0x33333333

Ответы [ 2 ]

10 голосов
/ 14 мая 2011

Сначала следует удалить (сделать это 0) цифру.

row &= ~(0xf << 4);

~ Оператор инвертирует значения всех битов в числе.Так.0x000000f0 становится 0xffffff0f.

Ваш код должен выглядеть следующим образом:

row &= ~(0xf << 8);
row |= 0x3 << 8;
row &= ~(0xf << 4);
row |= 0x2 << 4;
row &= ~(0xf << 0);
row |= 0x1 << 0;
3 голосов
/ 14 мая 2011

Как объяснил Александру, вам нужно очистить поле битов, которое вы пытаетесь установить, прежде чем приступить к его установке.

Просто добавьте дополнительный комментарий о том, почему ваш код не сделал того, что вы хотели, рассмотрим, что происходит с переменной на двоичном уровне:

row |= 0x2 << 4;

Оператор | = является «побитовым или». Следовательно, если либо бит, который вы пытаетесь установить, ИЛИ передаваемый бит, установлен на 1, результат равен 1. В вашем коде строка установлена ​​на 0x33333333, поэтому каждый 4-битный шестнадцатеричный цифра 0011 в двоичном виде. Когда вы поразрядно или что с 0x2 , вы получите 0x3:

/* 0x3 | 0x2 = 0x3 */
0011 | 0010 = 0011

Если вы сначала очистите битовое поле, вы получите 0x2, что вам нужно:

/* 0x3 | 0x0 = 0x0 */
0011 | 0000 = 0000

/* 0x0 | 0x2 = 0x2 */
0000 | 0010 = 0010

Обратите внимание, что манипулирование данными с использованием сдвигов и побитовых операций вряд ли будет переносимым между различными платформами. Вы можете столкнуться с проблемами, пытаясь выполнить код, основанный на битовых сдвигах, на машинах с различным порядком байтов или даже если вы попытаетесь запустить код, который работает на 32-битной машине на 64-битной машине:

http://www.viva64.com/en/a/0004/#ID0EQFDI

В Википедии есть больше побитовых операций:

http://en.wikipedia.org/wiki/Bitwise_operation

...