北大C++ 1.3 位运算

来源:互联网 发布:电脑提示激活windows 编辑:程序博客网 时间:2024/06/06 10:57

位运算


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
原创粉丝点击