C++ 位运算符总结

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__心似大海__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值