3
unsigned long long n = 0;
for (int i = 0; i <= 64; i+=2)
    n |= 1ULL << i;       //WHAT DOES THIS DO? AH! 

我试图围绕这段代码的第三行实际做了什么。有人请帮助清除这个!

4

5 回答 5

6

该行设置 n 的第 i

  • 1ULL是整数 1,类型为 unsigned long long。
  • <<是位移运算符。1ULL << i等于 2 i,或二进制:100...0i 零。
  • n |= x;是复合赋值运算符。它类似于写作n = n | x;
  • 运算符|是按位或运算符。

Wikipedia 有一个示例显示按位 OR 运算符在一般情况下的工作原理:

   0101 (decimal 5)
OR 0011 (decimal 3)
 = 0111 (decimal 7)

有关的

于 2012-06-14T17:08:31.653 回答
1

简单的|= 1ULL << i意思是设置第ith 位。for 每隔一个位循环一次,因此 64 位 unsigned long long 中的每个其他位都将设置为 1。

换句话说,你会得到一个有点像...0101010101.

于 2012-06-14T17:09:50.440 回答
1

它将 1 左移 i 个位置,并将结果与​​ n 进行或运算。实际上它是在 n 中设置第 i 位。

于 2012-06-14T17:09:51.363 回答
1

它二进制或 n 与值 1 位移 i 的值。

我相信 n 的(二进制)值将是:

0101010101010101010101010101010101010101010101010101010101010101

当循环完成时,虽然我还没有测试过..

于 2012-06-14T17:10:11.510 回答
1
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。

于 2012-06-14T17:13:59.920 回答