unsigned long long n = 0;
for (int i = 0; i <= 64; i+=2)
n |= 1ULL << i; //WHAT DOES THIS DO? AH!
我试图围绕这段代码的第三行实际做了什么。有人请帮助清除这个!
unsigned long long n = 0;
for (int i = 0; i <= 64; i+=2)
n |= 1ULL << i; //WHAT DOES THIS DO? AH!
我试图围绕这段代码的第三行实际做了什么。有人请帮助清除这个!
该行设置 n 的第 i位。
1ULL
是整数 1,类型为 unsigned long long。<<
是位移运算符。1ULL << i
等于 2 i,或二进制:100...0
i 零。n |= x;
是复合赋值运算符。它类似于写作n = n | x;
。|
是按位或运算符。Wikipedia 有一个示例显示按位 OR 运算符在一般情况下的工作原理:
0101 (decimal 5)
OR 0011 (decimal 3)
= 0111 (decimal 7)
有关的
简单的|= 1ULL << i
意思是设置第i
th 位。for 每隔一个位循环一次,因此 64 位 unsigned long long 中的每个其他位都将设置为 1。
换句话说,你会得到一个有点像...0101010101
.
它将 1 左移 i 个位置,并将结果与 n 进行或运算。实际上它是在 n 中设置第 i 位。
它二进制或 n 与值 1 位移 i 的值。
我相信 n 的(二进制)值将是:
0101010101010101010101010101010101010101010101010101010101010101
当循环完成时,虽然我还没有测试过..
n |= 1ULL << i; //WHAT DOES THIS DO? AH!
在右手边你有"1ULL" which is a constant 1 unsigned long long
。你是left bit shifting "1ULL" i number of times
。然后将“1ULL”左移的结果与 n 匹配以执行按位或。所以n will be set to (n | (1ULL << i))
。
这整行或操作将 n 的第 i 位设置为 1。