在学枚举算法的时候,遇到了熄灯问题,郭炜老师运用位运算解决了这个问题,之前也了解过位运算这个知识点,但也只是了解,现在觉得有必要好好学一下。
基本概念:
用于对整数类型变量中的某一位或若干位进行操作。比如:判断某一位是否为1,或者只改变其中某一位,其他位保持不变。
C和C++中的六种位运算操作符:
1、&(按位与)
将参与运算的两操作数个对应的二进制位进行与操作,只有对应的两个二进制位均为1时,结果的对应二进制位才为1,否则为0。
&的作用:通常用来将变量中的某些位清0且同时保留其他位不变;也可以用来获取某变量中的某一位。
例1:若要将int型变量n的后8位全置成0,而其余位不变,可以执行:n &= 0xffffff00
例2:如何判断一个int型变量n的第7位是否为1,只需看表达式:n & 0x80即可。
2、|(按位或)
将参与运算的两操作数个对应的二进制位进行或操作,只有对应的两个二进制位均为0时,结果的对应二进制位才为0,否则为1。
|的作用:通常用来将某些变量中的某些位置置为1而其他位不变。
例1:若要将int类型变量n的后8位全置成1,而其余位不变,可以执行:n |= 0xff
3、^(按位异或)
将参与运算的两操作数各对应的二进制位进行异或操作,即只有对应的两个二进位不相同时,结果的对应二进制位才是1,否则为0。
^的作用:通常用来将某变量中的某些位取反,而保留其他位不变。
例1:若要将int类型变量n的后8位取反,而其余位不变,可以执行: n ^= 0xff
^运算的特点是:如果a^b=c,那么就有c^b=a以及c^a=b;同时,异或运算支持运算的交换律和结合律。
利用此特点,我们可以在不利用第三个数的情况下,交换两个数。
x = x ^ y (1)
y = x ^ y (2) y=x^y=x^y^y=x^0=x
x = x ^ y (3) x=x^y=x^y^x=x^x^y=0^y=y
4、~(按位非)
单目运算符,其功能是将操作数中的二进制位0变成1,1变成0。
5、<<(左移运算符)
表达式:a<<b的值是将a各二进位全部左移b位后得到的值。左移时,高位丢弃,低位补0。、
实际上,左移1位,就等于是乘于2,左移n位,就等于是乘于乘于2^n。而左移操作比乘法操作快得多。
6、>>(右移运算符)
表达式:a>>b的值是将a各二进制全部右移b位后得到的值。右移时,移除最右边的位就被丢弃。a的值就被丢弃。a的值不因运算而改变。对于有符号数,如long,short,char类型变量,在右移时,符号位将一起移动,并且大多数C/C++编译器规定,如果原符号位为1,则右移时高位就补充1,原符号为0,则右移时高位补充0。
实际上,右移n位,就相当于左操作数除以2^n,并且将结果往小里取整。
以上是关于位运算的基本知识,更多高阶操作,详见下文。
https://blog.csdn.net/m0_37907797/article/details/103120886