位运算——给定一个整数,输出该整数对应的32位二进制

题目:给定一个整数,输出该整数对应的32位二进制

话不多说我们直接上代码

package com.lbmb.chapter01_bitOperation;

/**
 * @author 林文塨
 * @date 2022-07-02 19:02
 * description 给定一个整数,输出该整数对应的32位二进制
 */
public class Code01 {

    public static void printBinary(int num) {

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

    public static void main(String[] args) {
        int num = 7;
        printBinary(num);
    }
}

原理:

总所周知,在计算机的世界中只有0和1,任何位运算都是针对于二进制进行计算的。

首先我们来了解位运算中的与运算符(&)

"&"运算规则:
只有1&1为1,其它都为0

0&0=0; 0&1=0; 1&0=0; 1&1=1;

然后我们再来了解一下左移运算符(<<)和右移运算符(>>),这里说的移位运算都指的是有符号数算术移位,有关算数位移、逻辑移位和无符号数移位的内容不是本文的主要关注内容,请自行百度。

"<<"运算规则:
整体左移,右侧补0

左移前
00000000000000000000000000000001
左移后
00000000000000000000000000000010

">>"运算规则:
整体右移,符号位要一起移动,并且在左侧补上符号位

右移前
10000000000000000000000000000001
右移后
11000000000000000000000000000000

接下来就是重点了

我们随便取一个数:

int number = 3461343

他在计算机底层的32位二进制表示是:(int一般是4个字节,一个字节8bit)

00000000001101001101000011011111

我们用一个32次的循环,让1分别左移31次到0次会得到什么呢

for (int i = 31; i >= 0; i--) {
    1 << i:
}

我们会得到只有一位有1,其余全是0的32位二进制(其实这32个结果就代表着每个位上的状态)

10000000000000000000000000000000
01000000000000000000000000000000
00100000000000000000000000000000

00000000000000000000000000000100
00000000000000000000000000000010
00000000000000000000000000000001

那么我们再将这32个结果分别与上面3461343的二进制相与 &

00000000001101001101000011011111
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
10000000000000000000000000000000
01000000000000000000000000000000
00100000000000000000000000000000
...
00000000000000000000000000000100
00000000000000000000000000000010
00000000000000000000000000000001

因为0和任意其他相与都为0,对于10000000000000000000000000000000就能用后面31位的0把00000000001101001101000011011111后面的31位全抹成0,而最左边的1就能把目标数的最左边上的数提取出来。我们用32个不同位置的1提取32次,就能把目标数32位的信息全提取出来。

最后我们只要判断提取出来的数为0还是1,并进行打印即可

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

完整代码笔记

package com.lbmb.chapter01_bitOperation;

/**
 * @author 林文塨
 * @date 2022-07-02 19:02
 * description 给定一个整数,输出该整数对应的32位二进制
 */
public class Code01 {

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

    public static void main(String[] args) {
        int num = 3461343;
        printBinary(num);

        System.out.println("补充:下面是一些重要的二进制数");

        /*
        * 1.最大有符号整型的绝对值比最小整型的绝对值小
        * 2.范围是-2^31 ~ 2^31-1
        * 3.负数用了补码表述
        * */
        System.out.println("最大整型(十进制):" + Integer.MAX_VALUE);
        System.out.println("最小整型(十进制):" + Integer.MIN_VALUE);

        System.out.print("最大整型(二进制):");
        printBinary(Integer.MAX_VALUE);
        System.out.print("最小整型(二进制):");
        printBinary(Integer.MIN_VALUE);

        /*
        * 相反数可以用补码来计算,即取反加以
        * */
        int a = 5;
        int b = ~a + 1;
        System.out.println("用补码来计算相反数:" + a + " ================= " + b);

        /*
        * 对于有符号整型,正数都有唯一的负数作为相反数对应,但是负数有个例外,就是最小负数-2147483648
        * -2147483648的相反数是本身
        * */
        int x = Integer.MIN_VALUE;
        int y = ~x + 1;
        System.out.println("最小负数的相反数是本身:" + x + " ================= " + y);
    }
}

输出结果

00000000001101001101000011011111
补充:下面是一些重要的二进制数
最大整型(十进制):2147483647
最小整型(十进制):-2147483648
最大整型(二进制):01111111111111111111111111111111
最小整型(二进制):10000000000000000000000000000000
用补码来计算相反数:5 ================= -5
最小负数的相反数是本身:-2147483648 ================= -2147483648
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值