首先要理解整数在机器内是如何用补码表示的:原码、补码、反码
按位运算,就是对一个数(常量或变量)的二进制位与另一个数的对应二进制位进行运算。
位运算有:
& 位逻辑与,1&1等于1,1&0等于0,0&1等于0,0&0等于0
| 位逻辑或 ,1|1等于1,1|0等于1,0|1等于1,0|0等于0
^ 位逻辑异或 ,两个二进制位不同,结果为1,否则为0
~ 求反, 使一个数(常量或变量)的每一位变反,即0变1,1变0
>> 右移, 对一个数(常量或变量)的每一位右移
<< 左移, 对一个数(常量或变量)的每一位左移
例2.7.1 按位运算
#include <iostream>
using namespace std;
int main()
{
short int a,b,c;
a=11; //a的二进制表示 00000000 00001011
b=39; //b的二进制表示 00000000 00100111
c=-23; //c的二进制表示 11111111 11101001
cout<<(a&b)<<endl; // a&b的结果 00000000 00000011
cout<<(a|b)<<endl; // a|b的结果 00000000 00101111
cout<<(a^b)<<endl; // a^b的结果 00000000 00101100
cout<<(~a)<<endl; // ~a的结果 11111111 11110100
cout<<(c>>2)<<endl; // c>>2的结果 11111111 11111010
cout<<(a<<2)<<endl; //左移一位相当于乘2运算,这里左移了2位
return 0;
}
计算机内,整数是用补码表示的,能理解补码,就能解读程序的输出结果。
用移位运算实现整型变量a乘2(a<<2)或除2(a>>1)运算,效率比a*2或a/2运算高。
看看高手是如何活用位运算的
god-jiang:神级运算——位运算zhuanlan.zhihu.com