位运算符 | 和 << 的混淆问题

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

我正在努力理解这段代码的第三行实际上是做什么的。请有人帮忙澄清一下!


2
不对,ULL 表示“无符号长长整型”。 - pdriegen
虽然他只是在使用位模式,但这真的很重要吗? - tskuzzy
1
在64位环境中,@tskuzzy,是的。 - JoeFish
1
将一个64位的值左移64位实际上会调用未定义的行为——只允许0到63。最好将“i <= 64”更改为“i < 64”。 - Secure
5个回答

6
那行代码为n的第i位设置了一个比特位。
1ULL是无符号长整型数字1。 <<是一个位移操作符。1ULL << i等于2的i次方,或者二进制表示为:100...0,有i个零。
n |= x;是一个复合赋值运算符。它相当于写作n = n | x;。 |运算符是按位或运算符。
维基百科有一个示例,展示了按位或运算符在一般情况下的工作原理:
   0101 (decimal 5)
OR 0011 (decimal 3)
 = 0111 (decimal 7)

相关文章


1

|= 1ULL << i 的意思是将第 i 位设置为1。for循环遍历每个第二位,因此64位无符号长整型中的每个其他位都将被设置为1。

换句话说,您将获得一个位模式,如...0101010101


1

这是将1左移i位,然后将结果与n进行OR运算。实际上是在n中设置第i位的比特位。


1

它将n与i的值进行按位或运算,并将1左移i位。

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

0101010101010101010101010101010101010101010101010101010101010101

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


我没有看到 i+=2,所以我删除了我的答案。 - bluevector

1
n |= 1ULL << i;       //WHAT DOES THIS DO? AH! 

在右侧,您有一个"1ULL",它是一个常量1无符号长整型。您正在将"1ULL"左移i次。然后将“1ULL”的左移结果与n匹配以执行按位OR运算。因此,n将设置为(n | (1ULL << i))

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接