在ruby.h,我很難理解這個宏:爲什麼在Ruby源代碼中執行`&0xff`就像這樣?
#define SYMBOL_P(x) (((VALUE)(x)&0xff)==SYMBOL_FLAG)
我不知道爲什麼這&
操作與0xff
執行。並非每個號碼& 0xff
都等於自己?
在ruby.h,我很難理解這個宏:爲什麼在Ruby源代碼中執行`&0xff`就像這樣?
#define SYMBOL_P(x) (((VALUE)(x)&0xff)==SYMBOL_FLAG)
我不知道爲什麼這&
操作與0xff
執行。並非每個號碼& 0xff
都等於自己?
&是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
明白了,我忘了0xff是一個int,它應該是32位而不是8位。 – NickWEI
在Ruby源代碼值的類型通常是32位或64位,因此& 0xFF
將除最低8位以外的所有位設置爲0.
請檢查此http://edwinmeyer.com/Release_Integrated_RHG_09_10_2008/chapter02.html –
簡短的回答,然後:X是一個長。所以SYMBOLP()是一個宏,用於測試長符SYMBOL_FLAG的最右邊8位。 – slim