2016-01-07 71 views
0

在ruby.h,我很難理解這個宏:爲什麼在Ruby源代碼中執行`&0xff`就像這樣?

#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()是一個宏,用於測試長符SYMBOL_FLAG的最右邊8位。 – slim

回答

1

&是bitwize運算符(AND),(記得邏輯表?)

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

所以它做什麼嗎?

0xff的是255 二進制(DWORD)的六:00000000 00000000 00000000 11111111

所以假定數x = any_value

x的表示可以是這樣

???????? ???????? ???????? ???????? 
每個

?可以是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.

相關問題