《c/c++位运算》总结——c/c++的位运算符使用技巧

C语言的位运算有:与(&)、或(|)、异或(^)、取反(~)、左移(<<)、右移(>>)
位运算是指按二进制进行的运算,这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。

运算符 含义 描述

  • “&” 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
  • “|” 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
  • “^” 按位异或 若参加运算的两个二进制位值相同则为0,否则为1
  • “~” 取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
  • “<<” 左移 用来将一个数的各二进制位全部左移N位,右补0
  • “>>” 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

1.与运算(&)

参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;

   **即:两位同时为“1”,结果才为“1”,否则为0**

例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。

例如:9&5 即 0000 1001 (9的二进制补码)&00000101 (5的二进制补码) =00000001 (1的二进制补码)可见9&5=1。

按位与的用途可以用来清零
原理:若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件
实现:原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。
例:原数为43,即00101011(2),另找一个数,设它为148,即10010100(2),将两者按位与运算:
00101011(2)
&10010100(2)
00000000(2)

2.或运算(|)

参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;

   **即 :参加运算的两个对象只要有一个为1,其值为1。**

例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。

例如:9|5可写算式如下: 00001001|00000101 =00001101 (十进制为13)可见9|5=13
应用:
按位或运算常用来对一个数据的某些位定值为1。例如:如果想使一个数a的低4位改为1,则只需要将a与17(8)进行按位或运算即可。
交换两个值,不用临时变量。例如:a=3,即11(2);b=4,即100(2)
想将a和b的值互换,可以用以下赋值语句实现:
a=a∧b;
b=b∧a;
a=a∧b;
a=011(2)
(∧)b=100(2)
a=111(2)(a∧b的结果,a已变成7)
(∧)b=100(2)
b=011(2)(b∧a的结果,b已变成3)
(∧)a=111(2)

3.异或运算(^)

参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;

   **即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。**

例如:9^5可写成算式如下: 00001001^00000101=00001100 (十进制为12)可见9^5

4、“取反”运算符(~)

他是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。
运算规则:~2 = ~(0000 0010)= 1111 1101

5、左移运算符(<<)

左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由左操作数指定(左操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
运算规则:a=15<<2,即(0000 1111)<< 2,
左移后左边两位进制位舍弃,右边补0;得到 0011 1100,即a=15*2^(2)=60;

#include <stdio.h>
main()
{
int a=15;
printf("%d",a<<2);
}

结论:左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15<<2=60,即乘了4。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。

假设以一个字节(8位)存一个整数,若a为无符号整型变量,则a=64时,左移一位时溢出的是0,而左移2位时,溢出的高位中包含1。

6、右移运算符(>>)

右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。

注意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。
如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。

		例: a的值是八进制数113755: 
			 a:1001011111101101 (用二进制形式表示)
			 a>>1: 0100101111110110 (逻辑右移时)
			 a>>1: 1100101111110110 (算术右移时)
#include <stdio.h>
main()
{
int a=0113755;
printf("%d",a>>1);
}
原创文章 6 获赞 13 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44757097/article/details/105947466