zoukankan      html  css  js  c++  java
  • 算法:java打印int类型的二进制格式

    java打印一个int类型的二进制

    int类型占4个字节,一个字节8位,int共占32位。java中的int是无符号的(c语言还区分int整形和unsigned int无符号整型),取值范围 -231~231-1。

    二进制数在内存中以补码的形式存储的 

    正数:补码就是转化为二进制

    负数:补码符号位是1,其它位是对应正数的二进制的取反加一

    例如2的二进制就是:00000000000000000000000000000010 左起第一位是符号位, 0表示正数,其余后面31位是数值位。

    -2的二进制是:11111111111111111111111111111110 ,左起第一位是符号位是1表示负数,后面31位是2的二进制取反加一。

    (这块不太熟悉可以看这里https://www.cnblogs.com/lihaoyang/p/14156988.html

    给出一个int的十进制数字,比如2,怎么用java程序打印出它的二进制表示00000000000000000000000000000010呢?

    思路:我们看到的十进制 int a = 2; 只是java给我们做了格式化显示成了“2”,我们心里很清楚底层存储是00000000000000000000000000000010,要是能和计算机进行一个沟通,去到内存中找到a这块内存区域,拿一根探针,挨个问每一块小内存是0还是1,然后你把结果打印出来就能显示出二进制表示了。int有32位,所以我们就需要拿着“探针”问内存32次才能得到每一位是0还是1,怎么寻找这根“探针”呢?

    可以用

    10000000000000000000000000000000,

    01000000000000000000000000000000,

    00100000000000000000000000000000,

    00010000000000000000000000000000,

    ......

    00000000000000000000000000000010,

    00000000000000000000000000000001,

    这样的,从第32位一直到第1位,一次只有一位是1,其它位都是0的,32个二进制数做“探针”。与2(的二进制)进行与(&)32次,这一系列“探针”数字有个特点就是,第n个“探针”和2与之后,如果是1说明2的二进制当前位是1,如果是0说明2的当前位是0。

    **第一次与**
    
    探针:    10000000000000000000000000000000
    2的二进制:00000000000000000000000000000010
    
    结果:    0 
    
    **第二次与**
    
    探针    :01000000000000000000000000000000
    2的二进制:00000000000000000000000000000010
    
    结果:     0 
    
    **第三次与**
    
    探针    :00100000000000000000000000000000
    2的二进制:00000000000000000000000000000010
    
    结果:      0 
    
    ......
    
    第31次与
    
    探针:    00000000000000000000000000000010
    2的二进制:00000000000000000000000000000010
    
    结果:                                  1
    
    第32次与
    
    探针:    00000000000000000000000000000001
    2的二进制:00000000000000000000000000000010
    
    结果:                                   0
    

    java代码:

    public static void print(int num){
        for(int i=31;i>=0;i--){
            System.out.print(((num & 1 << i) & num) == 0 ? "0":"1");
        }	
    }
    

    解释:

    for循环里每次num和1右移i位进行与操作,i从31开始,每次减减,一直到0,正好是32位,这就是上面说的32个探针,去探测num的当前位是0还是1。

    验证:

    print(2); 输出00000000000000000000000000000010

    print(-2); 输出11111111111111111111111111111110 (符号位是1,数值位是2的二进制取反加一,正确)

    print(100);输出00000000000000000000000001100100

    说明print函数正确。

    欢迎关注个人公众号一起交流学习:

  • 相关阅读:
    Sonar代码分析实战(2)——1.1.1 Sonar安装环境要求
    无法在Mac Os下通过Gem安装Mysql
    HBase replication 代码分析
    ThinkPHP报js错误:Uncaught ReferenceError: out is not defined
    在Linux用tar归档压缩文件时忽略某些文件和目录
    mysql errno: 150 错误 外键
    2012年最经典的HyperV精品文章60篇
    三届(2012、2011、2009)KDD Cup内容、数据源和论文
    CVS安装及用户配置
    flex>MXML语法 小强斋
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/14157010.html
Copyright © 2011-2022 走看看