• 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
    
    
  • 相关阅读:
    winform解析json API数据
    c#(winform)获取本地打印机
    winform程序post提交数据API
    C#关于panle重叠
    net面试总结的题目
    委托
    最实用JS 留着学习
    dev 控件获得所有的EFDEVGRID
    c#利用WebClient和WebRequest获取网页源代码的比较
    浅谈.Net WebService开发
  • 原文地址:https://www.cnblogs.com/sakura579/p/12313040.html
Copyright © 2020-2023  润新知