【知识总结】常用二进制操作符

二进制题一般出现在数字计算题,某些奇怪的问题常常用二进制操作符能快速解决。

基本用法

二进制运算符 名称 含义 示例
&

与操作

只有当对应位全为1时结果为1。

作用于两个二进制数。

对整型数据进行操作时,两边为整型数据会自动转化为二进制数,输出结果还是十进制。

01011001 & 00101001 = 00001001

6 & 7 = 6

7 & 8 = 0

|

或操作 

只有当两个对应位都为0时结果位为0。

01011001 | 00101001 = 01111001

^

异或操作

当两个值在某一位上相同时结果位为0,不同结果为1。

如一个是1一个是0,结果位是1;两个都为1或者0结果位是0。

01011001 ^ 00101001 = 01110000

~

补操作

只对一个二进制数据进行操作。

对该数每一位取反。即1变为0,0变为1。

~01011001 = 10100110

>>

右移操作

对一个值中的位右移某个特定数字的位数。

  • n为非负数时,n>>1和n/2的结果相等。
  • n为负数,
    • n是偶数时,n>>1和n/2的结果相等。
    • n是奇数时,n>>1和n/2的结果不同。

01011001 >> 2 = 0010110

-5 >> 1 = -3
-5 / 2 = -2

<< 左移操作

对一个值中的位左移某个特定数字的位数。

  • n<<1和n*2结果相等。

01011001 << 2 = 01100100

性能优化

在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者进行数据变换,灵活的位操作可以有效地提高程序运行的效率。

用法 原写法 位运算写法
代替除法 int I;
I = 257 / 8;
int I;
I = 257 >> 3;
代替取模

int J;

J = 456 % 32;

int J;

J = 456 - (456 >> 4 << 4);

联合多个bool值

bool read = true;

bool write = true;

bool execute = true;

int permission = 7;    // 111

...    

例题

1. leetcode5323. Sort Integers by The Number of 1 Bits(第20场双周赛的第1题)

计算一个数在二进制中1的位数。

参考

c++位运算符:https://blog.csdn.net/qq_36552817/article/details/88652458

右移一位和除二:https://blog.csdn.net/FlushHip/article/details/82495034

位运算的性能优化:https://blog.csdn.net/mazhongkai1994/article/details/53091089

位运算的好处:https://www.zhihu.com/question/34021773

发布了126 篇原创文章 · 获赞 2 · 访问量 3723

猜你喜欢

转载自blog.csdn.net/lemonade13/article/details/104497339
今日推荐