这些位运算符在做什么?
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 位推入队列。
我一直在为按位运算符及其实际用法而苦恼。我在网上找到了一个我正在用 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 位推入队列。