【位运算的用法】

【位运算符介绍】

C语言具有位逻辑运算和移位运算的独特功能,参与位运算的运算量必须是整数。位逻辑运算包括&(按位与)|(按位或)^(按位异或)~(取反)四种运算,移位运算有<<(左移)>>(右移)两种运算。其中~位单目运算符。

逻辑运算】

【 & (按位与)】

参与运算的量,如果相对应的两位都为1,则该位的结果值为1,否则为0,即:

0&0==0       0&1==0      1&0==0     1&1==1

如:a的值为0x1234b的值为0x00a&b运算的结果c应为:

       a    0001   0010   0011   0100

      & b   0000   0000   1111   1111

       c    0000   0000   0011   0100

按位与常用于将某个运算量的某些位清0或提取某些位的值。

如上例子,将变量的高8位清0,同时保留或提取低8位的值,可用一个高8位为0,低8位为1的值0x00ff和它进行按位与。

【 | (按位或)】

参与运算的量,如果相对应的两位都为0,则该位的结果值为0,否则为1,即:

0|0==0       0|1==1      1|0==1     1|1==1

如:a的值为0x1234b的值为0x00a|b运算的结果c应为:

       a    0001   0010   0011   0100

      |b    0000   0000   1111   1111

       c    0001   0010   1111   1111

    按位或常用于将某个运算量的某些位置1,如本例中将变量的低8位置1,高8位不变,可用一个高8位为0,低8位为1的值0x00ff和它进行按位或。

【  ^ (按位异或)】

参与运算的量,如果相对应的两位相异,则该位的结果为1,否则为0,即:

00==0       01==1      10==1     11==0

如:a的值为0x1234b的值为0x00ab运算的结果c应为:

       a    0001   0010   0011   0100

     b    0000   0000   1111   1111

       c    0001   0010   1100   1011

    按位异或有“与1异或”该位翻转,“与0异或”该位不变的规律。如本例中用0x00ff进行按位异或,使变量a的低8位翻转,高8位不变。

【 ~ (取反)】

将参与运算量的相对应位的值取反,即1001

如:a的值为0x1234,~a运算的结果c应为:

      a    0001   0010   0011   0100

      c    1110   1101   1100   1011

移位操作符】

【 <<  (左移)】

按位左移是将一个运算量的各位依次左移若干位,低位补0,高位舍弃不要。

假设机器字长为8位,变量a的值为16,将a左移二位,即a=a<<2   

左移前   0001  0000     左移后   0100  0000

由此看出,左移一位相当于该数乘2,左移二位相当于乘4,即22,但这要以该数左移之后不“溢出”为前提。

所谓“溢出”指该数已超过机器字长所能容纳的范围,如该例若继续左移二位,该数为16× 24=256,超出了字长8位的表示范围(257),即产生了溢出。  

【 >>  (右移)】

按位右移是将一个运算量的各位依次右移若干位,低位被移出,高位对无符号数补0,对有符号数要按最高符号位自身填补。

右移一位相当于该数除以2,但有可能带来误差。假设机器字长为8位,变量a值为15,将a右移二位,即a=a>>2    

右移前   0000  1111      右移后   0000  0011

如果a是带符号的负数,a=-16,存放在机器中的补码为1111  0000,则a=a>>2,值为- 4

右移前   1111  0000      右移后   1111  1100

 

移位操作可用于整数的快速乘除运算,左移一位等效于乘2,而右移一位等效于除以2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值