在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