2016-01-07 49 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.

相关问题