1. 位运算符的c语言的六种位运算符
&按位与|按位或^按位异或~取反<<左移>>右移 按位与运算符&是双目运算符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。 按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为11111111)。 main(){inta=9,b=5,c;c=a&b;printf(a=%d
b=%d
c=%d
,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
b=%d
c=%d
,a,b,c);} 按位异或运算符“^”是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。
参与运算数仍以补码出现。
例如 9^5可写成算式如下: 00001001^00000101=00001100(十进制为12) main(){inta=9;a=a^15;printf(a=%d
,a);} 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。
例如 ~9的求反运算为: ~(1001)结果为: 0110 左移运算符“<<”是双目运算符。左移n位就是乘以2的n次方。 其功能把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
1)例: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
2)例: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)
需要注意的一个问题是:int类型最左端的符号位和移位移出去的情况. 我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出, 例如: int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000 i = i << 1; 那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是,溢出.如果再接着把i左移1位会出现什么情况呢?
在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0. 左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如: int i = 1, j = 0x80000000; //设int为32位 i = i << 33; // 33 % 32 = 1 左移1位,i变成2 j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃 在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,不同编译器可能会不完全相同.
总之左移就是: 丢弃最高位,0补最低位 右移运算符“>>”是双目运算符。右移n位就是除以2的n次方
其功能是把“>>”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:设 a=15,a>>2 表示把00001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
右移对符号位的处理和左移不同: 对于有符号整数来说,比如int类型,右移会保持符号位不变,
例如: int i = 0x80000000; i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000 就是说,对于有符号数, 符号位向右移动后,正数的话补0,负数补1, 对于有符号数,在右移时,符号位将随同移动: 当为正数时, 最高位补0, 而为负数时,符号位为1, 也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位. 最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。 负数10100110 >>5(假设字长为8位),则得到的是 11111101 总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效
率高很多. x>>1;//相当于x/=2x<<1;//相当于x*=2x>>2;//x/=4x<<2;//x*=4x>>3;//x/=8x<<3;//x*=8以此类推. 无符号: main(){unsigneda,b;printf(inputanumber:);scanf(%d,&a);b=a>>5;b=b&15;printf(a=%d b=%d
,a,b);}请再看一例! main(){chara='a',b='b';intp,c,d;p=a;p=(p<<8)|b;d=p&0xff;c=(p&0xff00)>>8;printf(a=%d
b=%d
c=%d
d=%d
,a,b,c,d);} 1. 使特定位翻转 要使哪几位翻转就将与其进行∧运算的该几位置为1即可。
2 与0相∧,保留原值.
3.交换两个值,不用临时变量. 我们可以在不用引入其他变量就可以实现变量值的交换 用异或操作可以实现: a = a^b; //
(1) b = a^b; //
(2) a = a^b; //
(3) 异或操作满足结合律和交换律,且由异或操作的性质知道,对于任意一个整数a^a=0; 证:(第(2)步中的a) a = a^b =(将第(1)步中的b代入b) a^(a^b) = b; (第(3)步中的b)b =a^b = (将第(1)步中的b代入b,将第(2)步中的a代入a) a^b^a^a^b = a^a^a^b^b = a; 清零 A数中为1的位,B中相应位为0。然后使二者进行&运算,即可达到对A清零目的。
取一个数中某些指定位 取数A的某些位,把数B的某些位置1,就把数A的某些位与1按位与即可。
保留一位的方法 数A与数B进行&运算,数B在数A要保留的位1,其余位为零。
判断奇偶性 将变量 a的奇偶性。a与1做位与运算,若结果是1,则 a是奇数;将 a与1做位与运算,若结果是0,则 a是偶数。 判断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<<k)
将int型变量a的第k位置1, 即a=a|(1<<k)
int型变量循环左移k次,即a=a<<k|a>>16-k (设sizeof(int)=16)
int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)
整数的平均值
对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会绯龅模?颐怯萌缦滤惴ǎ?/DIV> int average(int x, int y) //返回X,Y 的平均值 { return (x&y)+((x^y)>>1); }
判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂 boolean power2(int x) { return ((x&(x-1))==0)&&(x!=0); }
不用temp交换两个整数 void swap(int x , int y) { x ^= y; y ^= x; x ^= y; } php: $a ='dd'; $b = 'bb'; $a = $a ^ $b; $b = $a ^ $b;
$a = $a ^ $b; echo $a,' ', $b; 10 计算绝对值 int abs( int x ) { int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y }
取模运算转化成位运算 (在不产生溢出的情况下) a % (2^n) 等价于 a & (2^n - 1) 12 乘法运算转化成位运算 (在不产生溢出的情况下) a * (2^n) 等价于 a<< n 13. 除法运算转化成位运算 (在不产生溢出的情况下) a / (2^n) 等价于 a>> n 例: 12/8 == 12>>3 14 . a % 2 等价于 a & 1 15 if (x == a) x= b; else x= a; 等价于 x= a ^ b ^ x;
16 x 的 相反数 表示为 (~x+1)abc
2. c语言之中的位运算符是怎么运算的呢
C语言提供了表12—1所列出的6种位运算符以及表12-2所列出的5种扩展运算符。
表12-1
运 算 符 含 义 优 先 级
~ 按位求反 高
<< 左移
低
>> 右移
& 按位与
^ 按位异或
| 按位或
表12-2
扩 展 运 算 符 表 达 式 等 价 的 表 达 式
<<= a<<=2 a=a<<2
>>= b>>=1 b=b>>1
&= a&=b a=a&b
^= a^=b a=a^b
|= a|=b a=a|b
【说明】
位运算符中,只有“反求”(~)是单目运算符,即要求运算符两侧各有一个运算量,其余均为双目运算符。
运算的运算对象只能是整形或字符型数据,不能是其他类型的数据,在VC 6.0中整形数据占4个字节,字符型数据占1个字节。
参与运算时,操作数都必须首先转换成二进制形式,然后再执行相应的按位运算。
各双目运算符与赋值运算符结合可以组成扩展的赋值运算符,见表12-2.
12.2 位运算符详解
12.2.1 按位与运算
按位与运算“&”的运算格式:
操作数1&操作数2
【说明】
其中“操作数1”和操作数“2”必须是整型或字符型数据。
按位与运算规则是:当参加运算的2个二进制数的对应位都为1,则该位的结果为1,否则为0,即0&0=0,0&1=0,1&0=0,1&1=1。
【例如】
4&5的运算如下:
00000100 (4)
(&) 00000101 (5)
00000100 (4)
因此,4&5的值为4。
可以利用按位与运算来实现一些特定的功能,下面介绍几种常见的功能。
清零
如果想将一个数的全部二进制置为零,只要找一个二进制数,其中个个位要符合以下条件:原来的数中为1的位,新数中相应的位为0。然后使二者进行按位与运算即可达到清零的目的。
【例如】
原有数为171,其二进制形式为10101011,另找一个数,设它为00010100,它符合以上条件,即在原数为1的位置上,它的位值均为0。将两个数进行&运算:
10101011
(&) 00010100
00000000
当然也可以不用00010100这个数而用其他数(如01000100)也可以,只要符合上述条件即可。任何一个数与“0”按位于之后的结果为0。
娶一个数中某些指定位
【例如】
有一个两字节的短整型数x,想要取其中的低字节,只要将x与八进制数(377)8按位于即可。如图12-1所示,经过运算“z=x&y”后z只保留x的低字节,高字节为0.
x 00 10 11 00 10 10 11 00
y 00 00 00 00 11 11 11 11
z 00 00 00 00 10 10 11 00
图12-1 取x的低八位数
x 00 10 11 00 10 10 11 00
y 11 11 11 11 00 00 00 00
Z 00 10 11 00 00 00 00 00
图12-2 取x的高8位
如果想取两个字节中的高字节,如图12-2所示只需进行运算z = x &(177400)8。
保留一个数的某些位
要想将哪一位保留下来,就与一个数进行&运算,此数在该位取1。
【例如】
有一数01110100,想把其中左面第1、3、5位保留下来,可以这样运算:
01110100 (十进制数116)
(&) 10101010 (十进制数170)
00100000 (十进制数32)
3. c语言位运算符的用法
c语言位运算符的用法1
c语言位运算符的用法如下:
一、位运算符C语言提供了六种位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
1. 按位与运算
按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。
按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}
2. 按位或运算
按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下: 00001001|00000101
00001101 (十进制为13)可见9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}
3. 按位异或运算
按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)。
main(){
int a=9;
a=a^15;
printf("a=%d/n",a);
}
4. 求反运算
求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110。
5. 左移运算
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
6. 右移运算
右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的`各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d/tb=%d/n",a,b);
}
请再看一例!
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d/nb=%d/nc=%d/nd=%d/n",a,b,c,d);
}
c语言位运算符的用法2
C语言位运算。所谓位运算,就是对一个比特(Bit)位进行操作。比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了。
C语言提供了六种位运算符:
按位与运算(&)
一个比特(Bit)位只有 0 和 1 两个取值,只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0。例如1&1为 1,0&0为 0,1&0也为 0,这和逻辑运算符&&非常类似。
C语言中不能直接使用二进制,&两边的操作数可以是十进制、八进制、十六进制,它们在内存中最终都是以二进制形式存储,&就是对这些内存中的二进制位进行运算。其他的位运算符也是相同的道理。
例如,9 & 5可以转换成如下的运算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在内存中的存储)
也就是说,按位与运算会对参与运算的两个数的所有二进制位进行&运算,9 & 5的结果为 1。
又如,-9 & 5可以转换成如下的运算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
& 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-9 & 5的结果是 5。
关于正数和负数在内存中的存储形式,我们已在教程《整数在内存中是如何存储的》中进行了讲解。
再强调一遍,&是根据内存中的二进制位进行运算的,而不是数据的二进制形式;其他位运算符也一样。以-9&5为例,-9 的在内存中的存储和 -9 的二进制形式截然不同:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (-9 的二进制形式,前面多余的 0 可以抹掉)
按位与运算通常用来对某些位清 0,或者保留某些位。例如要把 n 的高 16 位清 0 ,保留低 16 位,可以进行n & 0XFFFF运算(0XFFFF 在内存中的存储形式为 0000 0000 -- 0000 0000 -- 1111 1111 -- 1111 1111)。
【实例】对上面的分析进行检验。
00001. #include
00002.
00003. int main(){
00004. int n = 0X8FA6002D;
00005. printf("%d, %d, %X ", 9 & 5, -9 & 5, n & 0XFFFF);
00006. return 0;
00007. }
运行结果:
1, 5, 2D
按位或运算(|)
参与|运算的两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1为1,0|0为0,1|0为1,这和逻辑运算中的||非常类似。
例如,9 | 5可以转换成如下的运算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1101 (13 在内存中的存储)
9 | 5的结果为 13。
又如,-9 | 5可以转换成如下的运算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
| 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-9 | 5的结果是 -9。
按位或运算可以用来将某些位置 1,或者保留某些位。例如要把 n 的高 16 位置 1,保留低 16 位,可以进行n | 0XFFFF0000运算(0XFFFF0000 在内存中的存储形式为 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。
【实例】对上面的分析进行校验。
00001. #include
00002.
00003. int main(){
00004. int n = 0X2D;
00005. printf("%d, %d, %X ", 9 | 5, -9 | 5, n | 0XFFFF0000);
00006. return 0;
00007. }
运行结果:
13, -9, FFFF002D
按位异或运算(^)
参与^运算两个二进制位不同时,结果为 1,相同时结果为 0。例如0^1为1,0^0为0,1^1为0。
例如,9 ^ 5可以转换成如下的运算:
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1100 (12 在内存中的存储)
9 ^ 5的结果为 12。
又如,-9 ^ 5可以转换成如下的运算:
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0010 (-14 在内存中的存储)
-9 ^ 5的结果是 -14。
按位异或运算可以用来将某些二进制位反转。例如要把 n 的高 16 位反转,保留低 16 位,可以进行n ^ 0XFFFF0000运算(0XFFFF0000 在内存中的存储形式为 1111 1111 -- 1111 1111 -- 0000 0000 -- 0000 0000)。
【实例】对上面的分析进行校验。
00001. #include
00002.
00003. int main(){
00004. unsigned n = 0X0A07002D;
00005. printf("%d, %d, %X ", 9 ^ 5, -9 ^ 5, n ^ 0XFFFF0000);
00006. return 0;
00007. }
运行结果:
12, -14, F5F8002D
取反运算(~)
取反运算符~为单目运算符,右结合性,作用是对参与运算的二进制位取反。例如~1为0,~0为1,这和逻辑运算中的!非常类似。。
例如,~9可以转换为如下的运算:
~ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0110 (-10 在内存中的存储)
所以~9的结果为 -10。
例如,~-9可以转换为如下的运算:
~ 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1000 (9 在内存中的存储)
所以~-9的结果为 8。
【实例】对上面的分析进行校验。
00001. #include
00002.
00003. int main(){
00004. printf("%d, %d ", ~9, ~-9 );
00005. return 0;
00006. }
运行结果:
-10, 8
左移运算(<<)
左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补0。
例如,9<<3可以转换为如下的运算:
<< 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0100 1000 (72 在内存中的存储)
所以9<<3的结果为 72。
又如,(-9)<<3可以转换为如下的运算:
<< 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1011 1000 (-72 在内存中的存储)
所以(-9)<<3的结果为 -72
如果数据较小,被丢弃的高位不包含 1,那么左移 n 位相当于乘以 2 的 n 次方。
【实例】对上面的结果进行校验。
00001. #include
00002.
00003. int main(){
00004. printf("%d, %d ", 9<<3, (-9)<<3 );
00005. return 0;
00006. }
运行结果:
72, -72
右移运算(>>)
右移运算符>>用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1。如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。
例如,9>>3可以转换为如下的运算:
>> 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0001 (1 在内存中的存储)
所以9>>3的结果为 1。
又如,(-9)>>3可以转换为如下的运算:
>> 1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 0111 (-9 在内存中的存储)
-----------------------------------------------------------------------------------
1111 1111 -- 1111 1111 -- 1111 1111 -- 1111 1110 (-2 在内存中的存储)
所以(-9)>>3的结果为 -2
如果被丢弃的低位不包含 1,那么右移 n 位相当于除以 2 的 n 次方(但被移除的位中经常会包含 1)。
【实例】对上面的结果进行校验。
00001. #include
00002.
00003. int main(){
00004. printf("%d, %d ", 9>>3, (-9)>>3 );
00005. return 0;
00006. }
运行结果:
1, -2
c语言位运算符的用法3
一、位运算符
在计算机中,数据都是以二进制数形式存放的,位运算就是指对存储单元中二进制位的运算。C语言提供6种位运算符。
二、位运算
位运算符 & |~<< >> ∧ 按优先级从高到低排列的顺序是:
位运算符中求反运算“~“优先级最高,而左移和右移相同,居于第二,接下来的顺序是按位与 “&“、按位异或 “∧“和按位或 “|“。顺序为~ << >> & ∧ | 。
例1:左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。
例如:
a<<4
指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
例2:右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:
设 a=15,
a>>2
表示把000001111右移为00000011(十进制3)。
应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。
例3:设二进制数a是00101101 ,若通过异或运算a∧b 使a的高4位取反,低4位不变,则二进制数b是。
解析:异或运算常用来使特定位翻转,只要使需翻转的位与1进行异或操作就可以了,因为原数中值为1的位与1进行异或运算得0 ,原数中值为0的位与1进行异或运算结果得1。而与0进行异或的位将保持原值。异或运算还可用来交换两个值,不用临时变量。
如 int a=3 , b=4;,想将a与b的值互换,可用如下语句实现:
a=a∧b;
b=b∧a;
a=a∧b;
所以本题的答案为: 11110000 。
4. c语言的按位运算符怎么操作!
位运算
在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能,
这使得C语言也能像汇编语言一样用来编写系统程序。
一、位运算符C语言提供了六种位运算符:
&
按位与
|
按位或
^
按位异或
~
取反
<<
左移
>>
右移
1.
按位与运算
按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1
,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下:
00001001
(9的二进制补码)&00000101
(5的二进制补码)
00000001
(1的二进制补码)可见9&5=1。
按位与运算通常用来对某些位清0或保留某些位。例如把a
的高八位清
0
,
保留低八位,
可作
a&255
运算
(
255
的二进制数为0000000011111111)。
main(){
int
a=9,b=5,c;
c=a&b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
2.
按位或运算
按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下:
00001001|00000101
00001101
(十进制为13)可见9|5=13
main(){
int
a=9,b=5,c;
c=a|b;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
}
3.
按位异或运算
按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下:
00001001^00000101
00001100
(十进制为12)
main(){
int
a=9;
a=a^15;
printf("a=%d\n",a);
}
4.
求反运算
求反运算符~为单目运算符,具有右结合性。
其功能是对参与运算的数的各二进位按位求反。例如~9的运算为:
~(0000000000001001)结果为:1111111111110110
5.
左移运算
左移运算符“<<”是双目运算符。其功能把“<<
”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,
高位丢弃,低位补0。例如:
a<<4
指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。6.
右移运算右移运算符“>>”是双目运算符。其功能是把“>>
”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:设
a=15,a>>2
表示把000001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,
最高位补0,而为负数时,符号位为1,最高位是补0或是补1
取决于编译系统的规定。Turbo
C和很多系统规定为补1。
main(){
unsigned
a,b;
printf("input
a
number:
");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",a,b);
}
请再看一例!
main(){
char
a='a',b='b';
int
p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}
5. C语言中“按位运算符”是什么意思
1、按位运算符就是直接对整数在内存中的二进制位进行操作运算。比如,&&运算本来是一个逻辑运算符,但整数与整数之间可以用&进行运算。举个例子,6的二进制是110,11的二进制是1011,那么6 & 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
2、C语言提供了六种按位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
6. C语言中位移位运算符
c语言位运算符包括 位逻辑运算符 和 移位运算符。
位逻辑运算符:&按位与,|按位或,^按位异或,~取反
移位运算符:<<左移,>>右移
-----------------------------------------------------------------------
&按位与运算符:二进制中运算,0&0=0,0&1=0,1&0=0,1&1=1,相当于布尔型的与运算
|按位或运算符:二进制中运算,0|0=0,0|1=1,1|0=1,1|1=1,相当于布尔型的或运算
^按位异或运算符:二进制中运算,0^0=0,0^1=1,1^0=1,1^1=0,0与0位异或等于0,1与1位异或等于0,1和0异或等于1
~取反运算符,二进制中运算:~1=0,~0=1,非1等于0(非真得假)非0等于1(非假得真)。
<<左移运算符:运算规则:把"<<"左边的运算数的各二进制位全部左移若干位,移动的位数由"<<"右边的数指定,高位丢弃,地位补0。可以实现乘法运算,二进制0000011<<2得二进制00001100.
>>右移运算符:运算规则:把">>"左边的运算数的各二进制位全部右移若干位,移动的位数由">>"右边的数指定。有符号的数右移时符号也随着右移;是正数的话在最高位补0,是负数的话,符号位为1,最高位补0还是补1决取于计算机系统的规定。移入0的称为"逻辑右移",移入1的称为“算术左移”。很多系统规定为补1,即“算术右移”。右移运算可以实现除法的功能,右移1位相当于该数除以2,右移n位相当于该数除以2的n次方。
-------------------------------------------------------------------------
运算符 优先级 运算符类型
& 8 双目
| 10 双目
^ 9 双目
~ 2 单目
<< 5 双目
>> 5 双目
---------------------------------------------------------------------------
7. c语言位运算是什么
运算:C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。
在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。
当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则就会显得十分重要。
运算符号:
比较特别的是,比特右移(>>)运算符可以是算术(左端补最高有效位)或是逻辑(左端补0)位移。
例如,将11100011右移3比特,算术右移后成为11111100,逻辑右移则为00011100。因算术比特右移较适于处理带负号整数,所以几乎所有的编译器都是算术比特右移。
运算符的优先级从高到低大致是:单目运算符、算术运算符、关系运算符、逻辑运算符、条件运算符、赋值运算符(=)和逗号运算符。