移位操作---左移和右移

本文深入解析计算机中二进制移位操作的原理,包括左移和右移的具体实现方法及计算过程,并通过实例展示操作结果。同时强调不同数据类型在移位操作中的特殊规则,如符号位的处理方式,以及如何避免潜在的精度损失问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里面所有的操作都是针对存储在计算机中中二进制的操作,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示。

左移位:<<,有符号的移位操作
左移操作时将运算数的二进制码整体左移指定位数,左移之后的空位用0补充。

右移位:>>,有符号的移位操作
右移操作是将运算数的二进制码整体右移指定位数,右移之后的空位用符号位补充,如果是正数用0补充,负数用1补充。

======================================

《移位操作的简单计算方法》

  >>右移操作

  x>>y

  就是x除以2的y此方,取整数

  <<左移操作

  x<<y

  就是x乘以2的y次方

//

例子:

public static void main(String[] args)
{

System.out.println(3<<2);//3左移2位
System.out.println(-3<<2);//-3左移2位

System.out.println(6>>2);//6右移2位
System.out.println(-6>>2);//-6右移2位

}

输出结果:

12   

-12   

1   

-2

分析:

00000000 00000000 00000000 00000110    +6在计算机中表示方法
0000000000 00000000 00000000 000001  
10 右移两位,正数补0,结果为1
-----------------------------------------------------------------------------------------------------

11111111 11111111 11111111 11111001
11111111 11111111 11111111 11111010
   -6在计算机中的表示
0011111111 11111111 11111111 111110 
10 右移两位,补充0,结果为1073741822???


可以参考

移位操作要注意的问题是高(低)位是补0还是补1和对char, byte, short型的操作:
(1)<< : (left-shift), 最低位补0
(2)>> : (signed right-shift), 右移过程使用符号位扩展(sign extension),即如果符号为为1则高位补1, 是0则补0,也就是逻辑右移
(3)>>> : (unsigned right-shit),右移过程使用零扩展(zero extension),即最高位一律补0,也就是算术右移
(4)移位操作的数据类型可以是byte, char, short, int, long型,但是对byte, char, short进行操作时会先把它们变成一个int型,最后得到一个int型的结果,对long型操作时得到一个long型结果,不可以对boolean型进行操作。
(5)移位操作符可以和=合并起来,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示将a右移两位后的值重新赋给a。当时在使用这三个操作符对 byte, char, short型数据进行操作时要注意,例如有一下代码片段:

public  class  ShiftTest
{
public  static  void  main(String [] args)
{
byte  a;
byte  b;
byte  c;
a
  =  127 ;
b
  =  127 ;
c
  =  127 ;
a
  <<=  2 ;
System.out.println(a);
System.out.println(b
  <<=  2 );
System.out.println(c
  <<  2 );
}
}

运行结果是:
-4
-4
508
这说明了在操作a <<= 2 执行过程是这样的:先将 byte型的数 127变成int型,左移2位得到 508,然后把508赋给byte型变量a时只是简单地"折断"(truncate)得到数-4。编译时编译器不会提示你可能损失精度(实际上在本例中确实是损失精度了),

但是如果你把a <<= 2改成 a = a << 2;编译器就会提示可能损失精度了。


本文转自http://blog.sina.com.cn/s/blog_439f80c40100n0hc.html,感谢作者。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值