4

谁能告诉我 1LL 和 -1LL 到底是什么?这是使用它们的行:

#define All_In(G) (((G) == 64) ? (W64)(-1LL) : ((1LL << (G))-1LL))
4

4 回答 4

5

宏的目的似乎是产生一个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

位移,如果你不知道那是什么

于 2013-08-28T23:07:14.707 回答
3

LL代表LongLong,意思是至少64位

于 2013-08-28T22:53:28.433 回答
3

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

宏以这种方式工作:

  1. 如果输入参数是 64((G) == 64)?参见三元运算符?:),则它产生一个二进制表示为 64 的数字1(W64)(-1LL)其中W64指定数字的宽度为 64 位)。为此,您需要知道,在有符号整数和 2 补码表示的情况下,-1 表示所有位都设置为 1。例如,在有符号字符的情况下,值范围从 -128 到 127。二进制表示-128 是11111111. 将此扩展到 64 位长度。
  2. 如果输入不是 64,那么它会产生一个在二进制表示中具有与指定一样多的 1 的数字: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 编译器)。

于 2013-08-29T00:01:34.590 回答
2

这行代码是一个宏,它从小于或等于 64 a 的正整数生成,其二进制扩展中long long有那么多1s。 AllIn(G)等于 $2^G - 1$。该死的,没有 TeX。所以,

AllIn(1)  == 0x0000000000000001LL
AllIn(2)  == 0x0000000000000003LL
AllIn(3)  == 0x0000000000000007LL
AllIn(4)  == 0x000000000000000FLL
AllIn(5)  == 0x0000000000000011LL
...
AllIn(64) == 0xFFFFFFFFFFFFFFFFLL
于 2013-08-28T23:09:39.337 回答