位操作是程序设计中对位模式按位或二进制数的一元和二元操作。
在许多古老的微处理器上, 位运算比加减运算略快, 通常位运算比乘除法运算要快很多。
在现代架构中, 情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。
简介位运算符用来对二进制位进行操作,Java中提供了如下表所示的位运算符:位运算符中,除 ~ 以外,其余均为二元运算符。
操作数只能为整型和字符型数据。
C语言中六种位运算符:
& 按位与
| 按位或
^ 按位异或
~取反
右移
运算方法按位与运算按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。 按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为11111111)。
main(){ int a=9,b=5,c; c=a&b; printf("a=%d\nb=%d\nc=%d\n",a,b,c);}按位或运算按位或运算符“|”是双目运算符。 其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:
9|5可写算式如下:
00001001 | 00000101=00001101(十进制为13)可见9|5=13
main(){ inta=9,b=5,c; c=a|b; printf("a=%d\nb=%d\nc=%d\n",a,b,c);}按位异或运算按位异或运算符“^”是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。
参与运算数仍以补码出现。
例如
9^5可写成算式如下:
00001001 ^ 00000101=00001100(十进制为12)
main(){ inta=9; a=a^15; printf("a=%d\n",a);}求反运算求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。
例如
~9的求反运算为:
~(1001)结果为:
0110左移运算左移运算符“>5(假设字长为8位),则得到的是 11111101 总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效
率高很多.
x>>1;//相当于x/=2x2;//x/=4x3;//x/=8x5; b=b&15; printf("a=%d\tb=%d\n",a,b); } 请再看一例!
main(){ chara='a',b='b'; intp,c,d; p=a; p=(p8; printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);}应用举例判断int型变量a是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数
取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
将int型变量a的第k位清0,即a=a&~(1