北大C++ 1.3 位运算

位运算


C/C++ 提供了6种位运算。

&按位与(双目)
|按位或(双目)
^按位异或(双目)
~按位非(单目)
<<左移(双目)
>>右移(双目)

1.

通常用来将某变量中的某些位清0且同时保留其他位不变。\

也可以用来获取某变量中的某一位。

n &= 0xf0  means n = n&0xf0;

&=

2.

|=


3.

^=

将某变量中的某些位取反,且保留其他位不变。

eg. 将int型的低8位取反,而其余位不变

n ^= 0xff;

重要特点1: (a^b=c)--->  (( c^b = a )   且 (c^a = b));  可以应用在最简单的\

加密和解密。

重要特点2:交换2个数。

int a = 5,b = 7;
a  ^= b;
b  ^= a;
a   ^= b;

4.  

<<=

a << b

a的值不发生改变。

左移1位,等于乘以2,左移n位,等于乘以pow(2,n). 但是左移操作的速度比乘法运算   \

的操作快很多很多。

5.

>>=

  • a >> b
  • a的值不发生改变。
  • 对于有符号数,如long, int, short, char类型变量,在右移时,符号位(即最高位)将一起移动,\
  • 并且大多数C/C++编译器规定,如果原符号位位1,则右移时高位就补充1,原符号位为0,\
  • 则右移时高位就补充0. 

实际上,右移n位,就相当于左操作数除以pow(2,n),并且将结果往小里取整。
eg. 这是一个规律,不是规定。
-25>>4 = -2
-2>>4 = -1
18>>4 = 1



#include <stdio.h>

int main()
{
    int n1 = 15;
    short n2 = -15;
    unsigned short n3 = 0xffe0;
    char c = 15;
    n1 = n1>>2;
    n2 >>= 3;
    n3 >>= 4;
    c >>=3;
    printf("n1=%d,n2=%d,n3=%d,c=%x\n",n1,n2,n3,c);
    return 0;
    //输出结果:n1=3,n2=-2,n3=4094,c=1
}

思考题: 

有两个int型的变量a和n(0<=n<=31),要求写出一个表达式,这个表达式的值和a的第n位相同。

(a>>n) & 1


当然这里的第0位,第1位是哪一位自己要想想清楚。

当0<=n<31时,还可以:(a&(1<<n)) >> n


位运算的速度优势那是超级棒的了!!!






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值