谁能告诉我 1LL 和 -1LL 到底是什么?这是使用它们的行:
#define All_In(G) (((G) == 64) ? (W64)(-1LL) : ((1LL << (G))-1LL))
谁能告诉我 1LL 和 -1LL 到底是什么?这是使用它们的行:
#define All_In(G) (((G) == 64) ? (W64)(-1LL) : ((1LL << (G))-1LL))
宏的目的似乎是产生一个G
设置了最低有效位的整数。 All_In(1)==1
, All_In(2)==3
, All_In(3)==7
, 等等。
在伪代码中,宏是这样说的:
if G == 64
produce -1
else
produce (1 bitshifted left by G) - 1
LL代表LongLong,意思是至少64位
LL
常量文字的后缀意味着需要将文字的类型解释为 long long(有符号)。要准确回答问题标题:1LL
是一个常量文字,它的值是1
,它的类型是 long long。同样,-1LL
是-1
类型 long long。
您不能将1LL
文字简单地传递给接受较小类型(如 long、short)的整数值的函数。可能在使用 All_In 宏的地方,预期的参数很长。
All_In(1) == 0b00000000...00000001LL
All_In(2) == 0b00000000...00000011LL
All_In(3) == 0b00000000...00000111LL
All_In(4) == 0b00000000...00001111LL
All_In(5) == 0b00000000...00011111LL
All_In(6) == 0b00000000...00111111LL
All_In(7) == 0b00000000...01111111LL
All_In(8) == 0b00000000...11111111LL
...
All_In(57) == 0b00000001...11111111LL
All_In(58) == 0b00000011...11111111LL
All_In(59) == 0b00000111...11111111LL
All_In(60) == 0b00001111...11111111LL
All_In(61) == 0b00011111...11111111LL
All_In(62) == 0b00111111...11111111LL
All_In(63) == 0b01111111...11111111LL
All_In(64) == 0b11111111...11111111LL
宏以这种方式工作:
(G) == 64)
?参见三元运算符?:
),则它产生一个二进制表示为 64 的数字1
((W64)(-1LL)
其中W64
指定数字的宽度为 64 位)。为此,您需要知道,在有符号整数和 2 补码表示的情况下,-1 表示所有位都设置为 1。例如,在有符号字符的情况下,值范围从 -128 到 127。二进制表示-128 是11111111
. 将此扩展到 64 位长度。1LL << (G))-1LL
. 这是按照以下方式进行的,让我们为输入 3 执行此操作,如果位长为 8。一种。首先它将 1 移动 3。
0b00000001 (2^0)
0b00000010 (2^1 after shifting by 1)
0b00000100 (2^2 after shifting by 1 again)
0b00001000 (2^3 after shifting by 1 again, 3 times all together)
湾。然后它从该数字中减去 1。这会产生我们想要的数字。2^n-1 总是由位组成,它们之间没有零。所以 2^3-1=7。哪个表示是:
0b00000111
可能这可以用来掩盖一些标志或其他东西。
请注意, (0b
在我的示例中表示二进制文字的前缀不适用于所有 C 编译器)。
这行代码是一个宏,它从小于或等于 64 a 的正整数生成,其二进制扩展中long long
有那么多1
s。 AllIn(G)
等于 $2^G - 1$。该死的,没有 TeX。所以,
AllIn(1) == 0x0000000000000001LL
AllIn(2) == 0x0000000000000003LL
AllIn(3) == 0x0000000000000007LL
AllIn(4) == 0x000000000000000FLL
AllIn(5) == 0x0000000000000011LL
...
AllIn(64) == 0xFFFFFFFFFFFFFFFFLL