zoukankan      html  css  js  c++  java
  • 2.1(java编程思想笔记)位移操作

    java位移操作主要有两种:

      有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数。

      有符号位左移时,低位补0。

      有符号右移时:当数字为正数,高位补0。当数字为负时高位补1.

      无符号位移:无符号位移不能保持原有正负性,与有符号位移的主要差异主要体现在右移时,

      无论数字是正数还是负数,高位统一补0.(无符号左移低位依然是补0)

    java编程思想里面有这样一句话:当int型数据位移时,只有数值右端的低5位才有用,long型数值只会用到数值右端的低6位。

    这里的数值指的是右操作数,即需要位移的位数,即将位移的位数转换为二进制,然后取后五位,这五位所代表的数值才是实际位移的数。

    这是因为int型数据一共有32位,而取右操作数的后五位(后五位最大表示31(1 1111),即最多移动31位)可以防止其位移出界。

    同样long型数据是64位,所指只考虑后六位,即最多移动63(11 1111)位。

    位移符号后面可以加“=”号,就类似s>>=2就相当于 s = s>>2;将原有数更新为位移后的数。 

    举个例子:

    例如 int i = 8; i>>33; i(0000 0000  0000 0000 0000 0000 0000 0000 0000 1000)

    位移时只考虑33对应二进制的后五位( 0010 0001),即只会位移(0 0001)一位。

    可以看做int i = 8>>(位移数%32)。 如果是long型数据就是位移33位,long的 实际位移数=位移数%64。

    例如int类型的3(011)实际只位移了一位变成了(110)。

    对于short、byte使用位移时需要注意,因为short、byte在进行位移操作是会先转换为int,然后进行位移。

    最后将位移结果进行截取。

    我们先看一个例子:

    public class Test {
        public static void main(String[] args) {
            byte b = -1;
            short s = -1;
            int i = -1;
            
            System.out.println("byte:	" + Integer.toBinaryString(b));
            System.out.println("short:	" + Integer.toBinaryString(b));
            System.out.println("int:	" + Integer.toBinaryString(b));
            
            b>>>=2;//(byte,short会先转换为int)先转换为int,然后位移,最后截取对应位数,然后将截取后的值赋给自身。
            s>>>=2;
            i>>>=2;
            
            System.out.println("byte:	" + b);
            System.out.println("short:	" + s);
            
            System.out.println("byte:	" + Integer.toBinaryString(b));
            System.out.println("short:	" + Integer.toBinaryString(s));
        }
    }
    运行结果:
    byte
    : 11111111111111111111111111111111 short: 11111111111111111111111111111111 byte: -1 short: -1 byte: 11111111111111111111111111111111 short: 11111111111111111111111111111111

     可以发现short、byte为-1时采用无符号位移,结果没有改变。

    我们来分析下执行过程:

    首先short通过Integer.toBinaryString(int i)方法转换为int显示,所以显示的是32个1.(负数采用补码存储,可百度补码规则)

    然后对s进行位移,s(16个1)会先转换为int型,就是32个1,然后进行无符号右移两位结果为(0011 1111 1111 1111 1111 1111 1111 1111)

    由于short占16位,所以截取后16位赋给s。即s(1111 1111 1111 1111),此时s依然为-1.

    当位移数超过16时,s才会有变化。

     参考资料:

    《java编程思想》

     https://segmentfault.com/q/1010000000414831

    https://blog.csdn.net/showershow/article/details/6959122

  • 相关阅读:
    DHCP协议详解(硬件方面原理)
    ASP.NET安全认证
    JAVA打包成.jar可运行项目
    JAVA菜单事件
    JAVA事件概述
    JAVA对话框事件
    各种事件汇聚
    把原来可空的列变成主键
    搜索模式中的所有表
    JAVA选项事件
  • 原文地址:https://www.cnblogs.com/huang-changfan/p/10567431.html
Copyright © 2011-2022 走看看