二进制题一般出现在数字计算题,某些奇怪的问题常常用二进制操作符能快速解决。
基本用法
二进制运算符 | 名称 | 含义 | 示例 |
& | 与操作 |
只有当对应位全为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 |
>> | 右移操作 |
对一个值中的位右移某个特定数字的位数。
|
01011001 >> 2 = 0010110 -5 >> 1 = -3 |
<< | 左移操作 | 对一个值中的位左移某个特定数字的位数。
|
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