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 。



C语言里的按位异或运算符
答:应用:1、使特定位翻转。假设有01111010,想使其低4位翻转。可以将它与0000111进行异或运算,结果为01110101。2、与0异或,保留原值。如012异或00=012.3、交换两个值,不用临时变量。假如a=3,b=4。想将a和b的值互换,可以用以下赋值语句实现:a=a异或b;b=b异或a;a=a异或b;C语言位运算符:与...

C语言中位运算符问题 这句话怎么解释啊
答:就不等于8除以8了;根据以上分析,对于带符号数负数,发现右移时有两种情况:补1(也就是符号位)进来,还能够保持除以2的n次方的关系成立;补0进来就不行。不同的C编译系统根据自己的特点在这个问题上可能就采取了不同的办法。比如VC和DEV C++,对于带符号数的右移运算就采取了补符号位的方式。

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

C语言中的“--”的用法
答:格式:需要移位的数字 << 移位的次数 例如:3<<2 3转换为二进制是0011,所有数字左移2个位置,空位补0,得到1100,即十进制数12。2、右移运算符(>>):按二进制把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位(正数补零,负数补1)。格式:需要移位的数字 >> 移位的...

C程序中,左移“<<”、右移“>>” 的具体用法是什么?
答:C语言中,“<<”为左移运算符,“>>”为右移运算符。具体使用方法如下:1、左移运算符(<<)将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。例:a = a << 2 将a的二进制位左移2位,右补0,左移1位后a = a * 2; 若左移时舍弃的高位不包含1,则每左移...

C语言中的按位运算符中>>和<<是怎样计算??例如:6<<2和6>>2怎样计算...
答:6<<2是六的二进制向左移两位 6 的二进制表示是110 左移两位是11000后面补 6>>2右移两位 110右移两位是1 把后面的10拿掉了,剩下1

在C语言中11种赋值运算符的具体含义,用法?
答:1.六个变量=表达式的赋值:=是赋值运算符,/=是除后赋值,*=是乘后赋值,=是取模后赋值,+=是加后赋值,-= 是减后赋值,2.<<=是左移后赋值,变量<<=表达式 左移就是将左边的数的二进制各位全部左移若干位,右边的数指定移动位数,高位丢弃,低位补0, 移几位就相当于乘以2的几次方。3....

C语言程序设计中运算符%(求余运算符)怎样使用?
答:由于/与%的运算优先级比+-优先级高,所以先运算/%,5/2=2,5%2=1(%此符号意思就是5除以2然后取 余数 ),然后运算加减运算,结果是:3.8

c语言中的>>和x<<运算符
答:4>>1, 表示4右移1位,就是相当于 4除2=2。2<<1,表示2左移一位,就是不是相当于 2*2=4。2<<3,表示2左移民3位,按8421码来算,第三位就是相当于数值8,即,2*8=16

学生必看c语言必看常见符号分类集合贴
答:关键字,又称为保留字,他们是C语言中预先规定的具有固定含义的一些单词,例如C语言的第一个程序中的int和return等,用户只能按预先规定的含义来使用他们不能擅自改变其含义。 2、标识符 标识符分为系统预定义标识符和用户自定义标识符两类。 顾名思义,系统预定义标识符就是由系统预先定义好的,例如主函数main和输出...