说明
由于平常比较少用位运算符直接处理数据,已逐渐忘记位运算符,但最近在刷算法时发现位运算符在处理数据时很方便,通过这篇文章来重新熟悉一下位运算符。
C语言的六种位运算符
位运算是指按二进制进行的运算,C语言提供了6个位操作运算符:
按位与: &
按位或: |
按位异或: ^
按位非(取反): ~
左移: <<
右移: >>
这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型
1,按位与运算 &
如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
例:
int n1,n2,n3;
n1=0;n2=1; //n1的二进制补码:00000000,n2的二进制补码:00000001
n3=n1&n2; //n3的二进制补码:00000000
n1=1;n2=1; //n1:00000001,n2:00000001
n3=n1&n2; //n3:00000001
2,按位或运算 |
如果两个相应的二进制位中只要有一个1,则该位的结果值为1,否则为0。
例:
int n1,n2,n3;
n1=0;n2=1; //n1的二进制补码:00000000,n2的二进制补码:00000001
n3=n1|n2; //n3的二进制补码:00000001
n1=1;n2=1; //n1:00000001,n2:00000001
n3=n1|n2; //n3:00000001
3,按位异或运算 ^
如果两个相应的二进制位相同,则该位的结果值为0,否则为1。
例:
int n1,n2,n3;
n1=0;n2=1; //n1的二进制补码:00000000,n2的二进制补码:00000001
n3=n1^n2; //n3的二进制补码:00000001
n1=1;n2=1; //n1:00000001,n2:00000001
n3=n1^n2; //n3:00000000
n1=15;n2=3; //n1:00001111,n2:00000011
n3=n1^n2; //n3:00001100
4,按位非(取反) ~
~ 是一元运算符,用来对二进制数按位取反,即将0变1,将1变0。
例:
int n1,n2;
n1=0; //n1的二进制补码:00000000
n2=~n1; //n2的二进制补码:11111111
n1=1; //n1:00000001
n2=~n1; //n2:11111110
5,左移 <<
将一个数的各二进制位全部左移N位,右补0,即将一个数乘2^n;
例:
int n1,n2;
n1=1; //n1的二进制补码:00000001
n2=n1<<1; //n2的二进制补码:00000010
n1=6; //n1:00000110
n2=n1<<2; //n2:00011000
6,右移 >>
将一个数的各二进制位全部右移N位,移到右端的低位被舍弃,即将一个整数型除2^n;
例:
int n1,n2;
n1=2; //n1的二进制补码:00000010
n2=n1>>1; //n2的二进制补码:00000001
n1=6; //n1:00000110
n2=n1>>2; //n2:000001
注意
位运算符的操作数必须是整数类型,并且遵循寻常算术转换。
寻常算术转换:如果 某个操作符 的各个操作数属于 不同的类型 ,那么除非其中一个操作数 转换 为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为 寻常算术转换。
如果某个操作数的类型在上面这个列表中 排名较低,那么首先要转换为 另外一个操作数 的类型后 执行运算。
更多推荐
C语言的位运算符
发布评论