zoukankan      html  css  js  c++  java
  • Java基础 -3.5

    我觉得上一篇不是很严谨啊
    我认为这个逻辑还是正确的

    1. 原码、反码、补码:
      (1)在Java中,所有数据的表示方式都是以补码形式来表示
      如果没有特别的说明,Java 中的数据类型默认为int,int数据类型的长度为4个字节,就是32bit的意思,
      (2)正数:原码、反码、补码相同
      (3)负数:符号位为1,其余各位是对原码取反,然后整个数加1
      (4)~按位取反 会将目标数的补码的各位取反
      (5)负数的补码是其绝对值的原码取反,末尾再加1

    ~正数的流程:

    1. 首先十进制数会被转化为二进制补码的形式;
    2. 然后上一步得到的二进制补码的各位取反(~发挥作用);
    3. 上一步得到的二进制数-1,然后取反,得到目标值(这个目标值是指~正数这个负数)的绝对值的补码;
    4. 上一步的补码转化为十进制正数,然后+负号,就得到了目标值。

    ~负数的流程:

    1. 首先将负数的绝对值转化为二进制补码的形式;
    2. 将上一步得到的二进制补码的各位取反再+1,得到负数的二进制补码;
    3. 将上一步得到的负数的二进制补码的各位取反(~发挥作用);
    4. 上一步得到的二进制序列转化为十进制就是目标值。
    1. 取反(~)运算

    (1)n=37 ,二进制数就是 100101
    原码/补码/反码:00000000 00000000 00000000 00100101 =37

    ~n(对n的补码) 取反运算得:  11111111 11111111 11111111 11011010 
    很明显,最高位是1,意思是取反后的数字为负数,负数的补码是其绝对值的原码取反,末尾再加1,因此,我们可将这个二进制数的补码进行还原:
    首先,末尾减1得反码:11111111 11111111 11111111 11011001
    其次,将各位取反得原码:00000000 00000000 00000000 00100110   这个就是n的绝对值形式,|n|=38   ,

    所以,~n=-38,这个就是Java虚拟机的运算结果

    (2)n= - 4, 取反 (~-4)。注意:Java中,所有数据的表示方式都是以补码形式

    原码:10000000 00000000 00000000 00000100

    反码:11111111 11111111 11111111 11111011

    补码:11111111 11111111 11111111 11111100

    对补码取反:00000000 00000000 00000000 00000011

    因为是正数,所以补码等于原码等于反码= 3,所以~-4 = 3

    public class zzz {
    	public static void main(String[] args) {
    		int i =-4;
    		//原码 1000 0000 0000 0000 0000 0000 0000 0100
    		//反码 1111 1111 1111 1111 1111 1111 1111 1011
    		//补码 1111 1111 1111 1111 1111 1111 1111 1100
    		//对补码求反
    		//    0000 0000 0000 0000 0000 0000 0000 0011
    		//3
    		System.out.println(~i);
    
    	}
    }
    >>> 3
    
    public class zzz {
    	public static void main(String[] args) {
    		int i =37;
    		//原码 0000 0000 0000 0000 0000 0000 0010 0101
    		//反码 0000 0000 0000 0000 0000 0000 0010 0101
    		//补码 0000 0000 0000 0000 0000 0000 0010 0101
    		//对补码求反
    		//    1111 1111 1111 1111 1111 1111 1101 1010
    		//-1
    		//    1111 1111 1111 1111 1111 1111 1101 1001
    		//取反
    		//    0000 0000 0000 0000 0000 0000 0010 0110
    		//32+4+2= 38
    		//加负号
    		// -38
    		System.out.println(~i);
    
    	}
    }
    >>> -38
    
    
  • 相关阅读:
    P2486 [SDOI2011]染色 (树链剖分)
    机房测试:Dove打扑克(vector暴力)
    机房测试:sort(归并+概率期望dp)
    区间覆盖问题总结(贪心)
    机房测试:停不下来的团长奥加尔(dp)
    博客目录
    团队作业week16
    Beta阶段项目展示
    Beta阶段项目终审报告
    Beta阶段测试报告
  • 原文地址:https://www.cnblogs.com/sakura579/p/12313040.html
Copyright © 2011-2022 走看看