这一篇就简单讲下C++按位操作符使用方法。
一、移位操作符(2字节16位下)
1.左移操作符
句法:Value << Shift (将指定值的所有位向左移动指定位数并将结果返回)
例如:
int n1 = 568;
int n2 = n1 << 3; //值也可以用字面值:int n2 = 568 << 3;
std::cout << n2 << std::endl;
上面代码,将值n1(568)所有位向左移动3位 并将结果返回给n2 相当于:568*2^3
实现细节:
如图表格第一行所示,值568是十进制的,在计算机内部都是以二进制存储的,所以转换成二进制为:1000111000 (前面的0已省去),当处理int n2 = n1 << 3;时,将执行左移操作,左移3位,所以移动后为图中表格第二行所示,结果为:1000111000000 (二进制)也就是十进制的 4544 (568*2^3)然后将结果返回给n2。
注意:所有位左移后,尾部腾出的各位将用0进行填充。
2.右移操作符
句法:Value >> Shift(将指定值的所有位向右移动指定位数并将结果返回)
例如:
int n1 = 731;
int n2 = n1 >> 3; //同上 也可以用int n2 = 731 >> 3:
std::cout << n2 << std::endl;
上面代码,将值n1(731)所有位向右移动3位 并将结果返回给n2 相当于731/2^3 只是由于移位操作符是针对无符号整形的 返回的也是整形 所以向右移动3位后是91
实现细节:
如图表格第一行所示,值731转换成二进制就是1011011011,当处理n1 >> 3移位指令时,将该值的二进制所有位向右移动3位,超过边界的将被删除(虚线内的),然后系统将自动为前面腾出来的各位填充0,得到结果为:1011011(前面0可省去)也就是十进制的91,并将结果返回给n2。
另外上面所讲的左移 右移操作符都可以用另一种形式,例如:当n2已定义为整型变量 则n2 >>=3 相当于int n2 = n2 >> 3 和 n2<<=3相当于int n2 = n2 << 3 。
二、逻辑按位操作符
操作符分别有:! ~(按位取反) &(按位与) |(按位或) ^(按位异或)
先来讲下(!)操作符,句法:!Value
int n1 = 10;
int n2 = !n1; //或int n2 = !10;
std::cout << n2 << std::endl;
该操作符将指定值若是非零均转换成false,即0。将值为0的转换成true 即1,例如上面代码因为n1的值(10)为非0值,所以转换成0。
再来讲下(~)操作符,句法:~Value
假如有以下代码:
int v = 463;
unsigned int Num = ~v; //或直接 ~463
std::cout << "Num:" << Num << std::endl; //Num:4294966832
当执行第二行代码时,系统自动将463所有位取反,并返回结果给Num,实现细节 结果为第二行:
另外如果想得到某个整数类型的变量的可以存储的最大值,可以使用~0,例如:
unsigned char v1 = ~0; //结果v1 = 255 相当于:FF
unsigned int v2 = ~0; //结果v2 = 4294967295 相当于:FFFFFFFF
然后是&(按位与)操作符,句法:Value1 & Value2
unsigned int NewNum = 683 & 713; //NewNum = 649
std::cout << "NewNum:" << NewNum << std::endl;
当有俩值:683 713 进行按位与运算后得到结果:649 实现细节:
表格第一行是683的系统内部存储格式二进制的形式,第二行是713的二进制形式,当这俩值进行按位与时,系统会对比这俩二进制数列的所有位,如果俩值相同位数的值都为1则结果的对应位就为1,否则为0。
接着|(按位或)操作符,句法: Value1 | Value2
unsigned int NewNum = 683 | 713; //NewNum = 747
std::cout << "NewNum:" << NewNum << std::endl;
还是用上面的俩值(683 713)来进行按位或操作,结果为747,实现细节:
当执行按位或操作时,系统将对俩值的所有对应二进制位进行比较,如果俩值对应的二进制位其中一个为1,则结果对应的二进制位就为1,都为0的话,结果对应位就为0。
最后是^(按位异或)操作符,句法:Value1 ^ Value2。
unsigned int NewNum = 683 ^ 713; //NewNum = 98
std::cout << "NewNum:" << NewNum << std::endl;
假设对683和713进行按位异或操作后,将得到结果98,实现细节:
当执行按位异或操作时,系统将对俩值的所有对应的二进制位进行比较,如果俩值对应的二进制位其中一个值为1(而不是俩个)则结果对应的二进制位就为1,如果俩值对应的二进制位都为1或都为0,结果对应的二进制位则为0。
好了,以上就是我对所有按位操作符的小小的使用方法与总结,如果有问题的地方,还请大家指出来,共同进步~谢谢!