位操作

移位运算

移位操作只是简单地把一个值的位向左或向右移动。

移位操作符
右移位操作符 >>
左移位操作符 <<

左移位
在左移位中,值最左边的几位被丢弃,右边多出来的几个空位则由0补齐。下面是一个左移位例子。

对于一个数n,左移4位,n<<4。
当n=7时,二进制表示       0000 0111
向左移动4位,空位补0      0111 0000 (十进制为112)

当n=-7时,二进制表示      1000 0111
向左移动4位,空位补0      1111 0000  (第一位为符号位,不变,十进制为-112)

当n=-1时,二进制表示      1000 0001
向左移动4位,空位补0      1001 0000  (第一位为符号位,不变,十进制为-16)

因此左移位时不管是整数还是负数,右边移入的位用0填充,称为逻辑移位。


右移位
       右移位有两种情况,一种是跟左移位相同的逻辑移位,即左边移入的位用0填充;另一种是算术移位,左边移入的位由原先该值的符号位决定,符号位为1,则移入的位均为1,符号位为0则移入的位均为0。

下面是右移位的例子
对于一个数n,右移4位,n>>4。
当n=7时,二进制表示为           0000 0111
向右移动4位,空位补0(符号位为0) 0000 0000(十进制为0)

当n=16时,二进制为        0001 0000
向右移动4位,空位补0     0000 0001(十进制为1)

当n为负数时此时向右移位不是简单的将负数的二进制为向右移动,而是将负数存储于内存中的补码向右移动。看下面的例子:

当n=-1时,二进制表示为        1000 0001
                              补码为       1111 1111
        右移四位再补四位后       1111 1111(还是-1的补码)

当n=-2时,二进制表示为         1000 0010
                             补码为         1111 1110
                          右移四位        1111 1111(-1的补码)

当n=-16时,二进制表示为       1001 0000
                              补码为        1111 1111
                          右移四位         1111 1111(-1的补码) 

当n=-32时,二进制表示为        1010 0000
                              补码为         1110 0000
                           右移四位         1111 1110(此时为-2的补码)

注意类似这种形式的移位:
a<<-5

       左移-5位表示什么呢?是表示右移5位吗?还是根本不移位?在某台机器上,这个表达式实际执行左移27位的操作。当移位的位数比操作数的位数还要多时,这种行为是未定义的。

位操作
位操作由三个操作符&、|、^,分别对它们的操作数的各个位执行AND、OR和XOR(异或)等逻辑操作。
  • 当两个位进行AND 操作时,如果两个位都是1,结果为1,否则结果为0。
  • 当两个位进行OR操作时,如果两个位都是0,结果为0,否则结果为1。
  • 当两个位进行XOR操作时,如果两个位不同,结果为1,如果两个位相同,结果为0。
位操作符要求操作数为整数类型,它们对操作数对应的位进行指定的操作,每次对左右操作数的各一位进行操作。例如变量a的二进制值为00101110,变量b的二进制值为01011011。a & b的结果是00001010,a | b的结果为01111111,a^b的结果为011110101。
位的操纵
下面的表达式显示了怎样使用移位操作符和位操作符来操纵一个整型值的单个位。表达式假定变量bit_number 为一整型值,它的范围是从0至整型值的位数减1,并且整型值的位从右向左计数。
第1个例子是把指定的位设置为1。
 value = value | 1<<bit_number;
下一个例子把指定的位清0。
 value = value & ~(1<<bit_number);
这些表达式常常写成|=和&=操作符形式。
下面这个表达式对指定的位进行测试,如果该位已被设置为1,则表达式的结果为非0值。
 value & 1 << bit_number

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值