黑马程序员 java学习笔记——位运算 左移 右移;

---------------------- android培训java培训、期待与您交流! ----------------------

 

 

一、逻辑移位(无符号数):不管原码、反码、补码,左移和右移一律补"0"
二、算术移位(有符号数):
  (1):真值为正数:不管原码、反码、补码,左移和右移一律补"0"
   
  (2):真值为负数:原码:补"0"
  反码:补"1"
  补码:左移补"0",右移补"1

  

          移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。

        
          若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。

 

 

 左移操作: x 《《 n

  x可以是byte, short, char, int, long基本类型, n(位移量)只能是int型

  编译器的执行步骤:

  1) 如果x是byte, short, char类型, 则将x提升为int;

  2) 如果x是byte, short, char, int类型, 则n被重新赋值(过程是:取n的补码的低5位再转成十进制的int值,相当对n取32模: n=n2);

  如果x是long型, 则n被重新赋值(过程是:取n的补码的低6位再转成十进制的int值,相当对n取64模: n=nd);

  (因为int类型为4个字节,即32位,移动32位将没有任何意义.对于long则是模64)

  3) 对x左移n个位数, 整个表达式产生一个新值(x的值不变);

  《《是左移符号,列x《《1,就是x的内容左移一位(x的内容并不改变)

  》》是带符号位的右移符号,x》》1就是x的内容右移一位,如果开头是1则补1,是0责补0,(x的内容并不改变).

  》》》是不带符号位的右移,x》》》1就是x的内容右移一位,开头补0(x的内容并不改变)

  补充说明:

  Java代码

  // 左移: 向左移动,右边补0

  for (int i = 0;i < 8 ;i++)

  System.out.print( (1 << i) + " ");

  // 右移: 向右移动,如果符号位(int型为32位)为0,左边补0,符号位为1,左边补1

  // 符号位为1的右移

  for (int i = 0;i < 8 ;i++)

  System.out.print( Integer.toHexString(0x40000000 >> i) + " ");

  output

  40000000 20000000 10000000 8000000 4000000 2000000 1000000 800000

  // 符号位为1的右移

  // 最高4位为1000, 右移1位,变成1100也就是c,

  for (int i = 0;i < 8 ;i++)

  System.out.print( Integer.toHexString(0x80000000 >> i) + " ");

 

 

 

 

 

 

 

 

---------------------- android培训java培训、期待与您交流! ----------------------
 

 

 

 

 

 

 

 

 

 

 

 

 



 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值