位运算符的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变1
将1变0

<<左移
运算规则
左移n位,相当于给一个十进制数乘以2的n次方

>>右移
运算规则
右移n位,相当于给一个十进制数除以2的n次方

前三个是两个二进制数之间的运算
后三个是一个二进制数自身的运算

按位异或,其操作符为^,形式为a^b计算时,根据操作数a和b每位的值,计算结果,当a,b的对应位上值相同时,结果的该位上值为0,否则值为1。如char a = 0x12, b = 0x34;a^b= 0x12 ^ 0x34= B0001 0010 ^ B0011 0100= B0010 0110=0x26

扩展资料:
异或,英文为exclusive OR,缩写成xor异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:a⊕b = (¬a ∧ b) ∨ (a ∧¬b)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
参考资料:异或百度百科

&按位与|按位或^按位异或~取反<<左移>>右移 按位与运算符&是双目运算符。 其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为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=%db=%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



位与和位或有什么区别?
答:3、C语言中的符号分为10类:算术运算符、关系运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、指针运算符、求字节数运算符和特殊运算符。4、位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种...

c语言中运算对象必须是整型的运算符是
答:在c语言中,运算对象必须是整型数的运算符是:①求余运算符 ②位运算符~、&、|、^、<<、>>。具体原因是:①求余运算必需是整型是因为求余是在整数除法中的运算。如图 ②位运算必需是整型是因为位运算是操作整数中的位。如图 C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种...

JAVA位运算符
答:有关这些操作的细节可以参看 www.pcvc.net/...id=247 位运算 前面介绍的各种运算都是以字节作为最基本位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。一、位运算符C语言提供了六种位运算符:& 按...

C语言中! x表示什么意思?
答:标题二:逻辑非运算的短路规则 在C语言中,逻辑非运算满足短路规则。即如果逻辑非运算的操作数为真时,其结果为假;如果逻辑非运算的操作数为假时,其结果为真。这种规则可以提高程序的执行效率。标题三:逻辑非运算与位运算的关系 在C语言中,逻辑非运算符!和位运算符~在某些情况下可以互相替代使用。

两个C++问题
答:(1)i=b; 是用逗号表达式赋值的 例题 i=30,a=6;还是逗号表达式赋值的 (2)一、位运算符C语言提供了六种位运算符:& 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 用法:1.按位与运算符 & 按位与运算符是双目运算符,其功能是将参与运算的两操作数各自对应的二进制为进行于...

c语言&符号什么意思?
答:&:在C语言中有两种意思,一种是取地址符,是单目运算符;另一种是位运算符,表示“按位与”,是双目运算符。&后面是个变量。每个变量对应一块存储空间。每个存储空间有一个编号,也就是地址,&变量名 表示取出这个编,变量名表示取出这个编号所对应的存储空间里的值。系统就会在内存中分配一个空间...

c语言中&是什么符号?代表什么?
答:按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位都为1时,结果位才为1。参与运算的两个数均以补码出现。整数在计算机中用二进制的位来表示,例如:3&10可写算式如下: 00000011&00001010 00000010 十进制2。其他位运算符:1、按位或运算符“|”是...

c语言中∧是什么意思?
答:C语言中“ ∧ ”是“按位异或”运算符(Bitwise exclusive OR operator)。整数在计算机中用二进制的位来表示,C语言提供一些运算符可以直接操作整数中的位,称为位运算,这些运算符的操作数都必须是整型的。按位异或运算符“^”是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应...

%在C语言里是什么意思?
答:在C语言里面是除余和调试输出的意思。表达式 a % b 就是计算 a 除以 b 得出的余数。例如:我们要把一个3位数0~999输出到3位数码管上,假设现在有值136,需要在第1个数码管显示1,第二个数码管显示3,第三个数码管显示6。把136的百位,十位,个位取出来,需要用到取余符号“%”。我们用x y...

IT评价网,数码产品家用电器电子设备等点评来自于网友使用感受交流,不对其内容作任何保证

联系反馈
Copyright© IT评价网