这些位运算符在做什么?

What are these bitwise operators doing?

我一直在为按位运算符及其实际用法而苦恼。我在网上找到了一个我正在用 C++ 做的事情的例子,想知道那里发生了什么。

    for (int i = 0; i < size / 2; ++i)
    {
        queue->push(temp[i] & 0xff);
        queue->push((temp[i] >> 8) & 0xff);
    }

我大致知道 "And" 和 "Shift" 运算符在做什么,但这对临时变量和结果有何影响。任何人都可以帮助理解吗?

临时变量在这两个操作中都不受影响。第一个逻辑操作是隔离临时变量的低 8 位并将它们推入队列,第二个操作是隔离接下来的 8 位(数字 8 到 15)并将它们推入队列。这两个操作重复size/2次。

第一条语句temp[i] & 0xff提取低8位因为0xff = 1111 1111.

第二条语句(temp[i] >> 8) & 0xff首先将temp[i]中的位右移8次,因此位置8到位置15的位现在将占用位置0到位置7的位. 当你用 0xFF 按位 & 时,你会得到从位置 0 到位置 7 的新位。

例如 -

假设,temp[i] = 0x01020304 然后 temp[i] & 0xff = 0x04(temp[i] >> 8) & 0xff = 0x03

我的建议:学会爱std::bitset。在处理位杂耍时,它经常派上用场。考虑这段代码:

#include <bitset>
#include <iostream>

int main() {
    unsigned long x = 12345678;

    std::bitset<32> a{ x} ;
    std::bitset<32> b{ x & 0xff };
    std::bitset<32> c{ (x >> 8) & 0xff };
    std::bitset<32> d{ 0xff };
    std::cout << a  << '\n' << b << '\n' << c << '\n' << d;
}

它的输出是(已添加注释)

00000000101111000110000101001110             // x
00000000000000000000000001001110             // x & 0xff
00000000000000000000000001100001             // (x>>8) & 0xff
00000000000000000000000011111111             // 0xff

所以这里发生的是...

0xff 是一个设置了低 8 位的整数文字。按位和 & 允许您屏蔽位,即结果具有在两个操作数中设置的那些位。移位运算符 >> 将位移动指定数量(在本例中为 8)。

总的来说,您的代码首先将前 8 位推入队列,然后将接下来的 8 位推入队列。