битовые операторы с беззнаковыми символами - PullRequest
2 голосов
/ 22 февраля 2011
unsigned char x = 93;
unsigned char a = x << 4;
printf("a = %d\n", a);

Я понимаю, как работают битовые операторы, но я не понимаю двоичное представление x.

Как это = 208?

Ответы [ 5 ]

4 голосов
/ 22 февраля 2011
93 = 01011101

Сдвиньте оставленные 4 бита и оставьте следующее (только 8 бит в вашем результате):

11010000 = 208
3 голосов
/ 22 февраля 2011
x = 93 = 0x5D = 0101 1101
         << 4 = 1101 0000

1101 0000 в десятичном виде - 208.

1 голос
/ 22 февраля 2011

Математически это соответствует следующему:

x << 4 равно x * 16, поэтому x * 16 = 93 * 16 = 1488 </p>

но a является беззнаковым символом (т. Е. 0 <= a <256), поэтому a = 1488 по модулю 256 = 208 </p>

1 голос
/ 22 февраля 2011
93 = 0x5d
0x5d << 4 = 0x5d0
0x5d0 & 0xff = 0xd0
0xd0 = 208

то есть, здесь произошло то, что верхние биты были отрезаны.

0 голосов
/ 22 февраля 2011

Это потому, что неподписанный символ может быть только 255 (1111 1111 в двоичном виде).Если число смещено влево, все биты, выходящие за его пределы, теряются.0b11111111 << 1 = 0b11111110 </p>

Итак, если вы получите 93 в двоичном виде (0101 1101) и сдвинете его влево 4 раза, вы получите 1101 0000 - 4 крайних левых бита потеряны навсегда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...