2016-01-07 2 views
0

в ruby.h, мне трудно понять этот макрос:Почему `& 0xff` выполняется как в исходном коде Ruby?

#define SYMBOL_P(x) (((VALUE)(x)&0xff)==SYMBOL_FLAG) 

Я понятия не имею, почему это & операция выполняется с 0xff. Разве не каждый номер & 0xff равен самому себе?

+0

проверить это http://edwinmeyer.com/Release_Integrated_RHG_09_10_2008/chapter02.html –

+0

Короткий ответ: X длинный. Таким образом, SYMBOLP() является макросом, чтобы проверить, являются ли самые правые 8 бит длинного соответствия SYMBOL_FLAG. – slim

ответ

1

& является оператором bitwize (И), (помните логическую таблицу?)

0 & 0 = 0 
1 & 0 = 0 
0 & 1 = 0 
1 & 1 = 1 

так, что он делает здесь?

0xff является гекса 255 в двоичной системе (DWORD): 00000000 00000000 00000000 11111111

так, предполагая число х = any_value

представление х может быть как этот

???????? ???????? ???????? ???????? 

каждого? может быть либо 1, либо 0

поэтому применение bitwize оператора & (AND) с маской 0xff дает

???????? ???????? ???????? ???????? 
& 
    00000000 00000000 00000000 11111111 
= 
    00000000 00000000 00000000 ???????? 

, например

00000000 00000000 00000011 00000011 
& 
    00000000 00000000 00000000 11111111 
= 
    00000000 00000000 00000000 00000011 
    ^________________________^ ^______^ 
      zeroed    kept 
+0

понял, я забыл, что 0xff - это int, который должен быть 32 бита, но не только 8 бит. – NickWEI

0

тип значения в исходном коде Ruby, как правило, 32 -бит или 64-бит, поэтому & 0xFF устанавливает все биты, кроме самых низких, от 8 до 0.

Смежные вопросы