贾程阳的摆烂日记之位运算

在学枚举算法的时候,遇到了熄灯问题,郭炜老师运用位运算解决了这个问题,之前也了解过位运算这个知识点,但也只是了解,现在觉得有必要好好学一下。

基本概念:

用于对整数类型变量中的某一位或若干位进行操作。比如:判断某一位是否为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值