与按位运算混淆|和<<

时间:2012-06-14 17:05:47

标签: c bit-manipulation

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

我正试图围绕这段代码的第三行实际做的事情。有人请帮忙清除这个!

5 个答案:

答案 0 :(得分:5)

该行设置n的 th 位。

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

维基百科有一个例子,展示了在一般情况下按位OR运算符的工作原理:

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

相关

答案 1 :(得分:1)

|= 1ULL << i只是意味着设置i位。 for循环遍历每秒,因此64位无符号long long中的每个其他位都将设置为1。

换句话说,你会得到像...0101010101一样的模式。

答案 2 :(得分:1)

它在i处移位1,并将结果与​​n进行OR运算。实际上它在n中设置了第i位。

答案 3 :(得分:1)

二进制或n,其值为1位,移位i的值。

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

0101010101010101010101010101010101010101010101010101010101010101

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

答案 4 :(得分: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匹配以执行按位OR。所以n will be set to (n | (1ULL << i))

整行或操作将n的第i位设置为1。