1. 参考
本文参考并整理自链接: https://zh.cppreference.com/w/cpp/language/operator_arithmetic.
2. 逐位逻辑运算符 ~、&、|、^
逐位非 (NOT)~
~ 右操作数
结果是实参值(提升后)的逐位非(反码)
示例代码:
#include <iostream>
#include <iomanip>
#include <bitset>
int main()
{
using bin16 = std::bitset<16>;
using bin32 = std::bitset<32>;
uint32_t x0 = 0x12345678;
std::cout << std::hex << std::showbase
<< " x0: " << x0 << std::setw(33) << bin32(x0) << '\n'
<< "~x0: " << ~x0 << std::setw(33) << bin32(~x0) << '\n';
}
结果:
x0: 0x12345678 00010010001101000101011001111000
~x0: 0xedcba987 11101101110010111010100110000111
逐位与 (AND)&
左操作数 & 右操作数
结果是两个操作数值(经一般算术转换后)的逐位与
两位都是1,这一位结果才是1
示例代码:
#include <iostream>
#include <iomanip>
#include <bitset>
int main()
{
using bin16 = std::bitset<16>;
using bin32 = std::bitset<32>;
uint16_t mask = 0x00f0;
uint32_t x0 = 0x12345678;
std::cout << std::hex << std::showbase
<< " mask: " << mask << std::setw(39) << bin32(mask) << '\n'
<< " x0: " << x0 << std::setw(33) << bin32(x0) << '\n'
<< "mask & x0: " << (mask & x0) << std::setw(39) << bin32(mask & x0) << '\n';
}
结果:
mask: 0xf0 00000000000000000000000011110000
x0: 0x12345678 00010010001101000101011001111000
mask & x0: 0x70 00000000000000000000000001110000
逐位或(OR)|
左操作数 | 右操作数
结果是两个操作数值(经一般算术转换后)的逐位或
只要有一个是1,这一位结果就是1
示例代码:
#include <iostream>
#include <iomanip>
#include <bitset>
int main()
{
using bin16 = std::bitset<16>;
using bin32 = std::bitset<32>;
uint16_t mask = 0x00f0;
uint32_t x0 = 0x12345678;
std::cout << std::hex << std::showbase
<< " mask: " << mask << std::setw(40) << bin32(mask) << '\n'
<< " x0: " << x0 << std::setw(34) << bin32(x0) << '\n'
<< "mask | x0: " << (mask | x0) << std::setw(34) << bin32(mask | x0) << '\n';
}
结果:
mask: 0xf0 00000000000000000000000011110000
x0: 0x12345678 00010010001101000101011001111000
mask | x0: 0x123456f8 00010010001101000101011011111000
逐位异或(XOR)^
左操作数 ^ 右操作数
结果是两个操作数值(经一般算术转换后)的逐位异或
该位不同(一个0,一个1)时,该位结果为1; 都为0 或都为1,结果为0.
示例代码:
#include <iostream>
#include <iomanip>
#include <bitset>
int main()
{
using bin16 = std::bitset<16>;
using bin32 = std::bitset<32>;
uint16_t mask = 0x00f0;
uint32_t x0 = 0x12345678;
std::cout << std::hex << std::showbase
<< " mask: " << mask << std::setw(40) << bin32(mask) << '\n'
<< " x0: " << x0 << std::setw(34) << bin32(x0) << '\n'
<< "mask ^ x0: " << (mask ^ x0) << std::setw(34) << bin32(mask ^ x0) << '\n';
}
结果:
mask: 0xf0 00000000000000000000000011110000
x0: 0x12345678 00010010001101000101011001111000
mask ^ x0: 0x12345688 00010010001101000101011010001000
移位运算符 <<、>>
左操作数 << 右操作数 (1)
左操作数 >> 右操作数 (2)
1) 将 左操作数 左移 右操作数 位
2) 将 左操作数 右移 右操作数 位
示例代码:
#include <iostream>
enum {ONE=1, TWO=2};
int main()
{
std::cout << std::hex << std::showbase;
char c = 0x10;
unsigned long long ull = 0x123;
std::cout << " 0x123 << 1 = " << (ull << 1) << '\n'
<< " 0x123 << 63 = " << (ull << 63) << '\n' // 无符号中的溢出
<< " 0x10 << 10 = " << (c << 10) << '\n'; // 提升 char 到 int
long long ll = -1000;
std::cout << std::dec << " -1000 >> 1 = " << (ll >> ONE) << '\n';
}
结果:
0x123 << 1 = 0x246
0x123 << 63 = 0x8000000000000000
0x10 << 10 = 0x4000
-1000 >> 1 = -500