前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

进制

原创
作者头像
染指花晨曦
修改2023-09-18 08:05:10
1290
修改2023-09-18 08:05:10
举报
文章被收录于专栏:浮梦浮梦

进制

简介

  1. 二进制:0、1,满2进1,以0b或0B开头
  2. 八进制:0~7,满8进1,以数字0开头表示
  3. 十进制:0~9,满10进1
  4. 十六进制:0~9及A(10)~F(15),满16进1,以0x或0X开头表示。此处A~F不区分大小写

进制转换(Java)

java.lang.Integer

代码语言:java
复制
final int tenNum = 123456789;
// 转二进制
System.out.println(Integer.toBinaryString(tenNum));
// 转八进制转
System.out.println(Integer.toOctalString(tenNum));
// 转十进制
System.out.println(Integer.toUnsignedString(tenNum));
// 转十六进制
System.out.println(Integer.toHexString(tenNum));

自写

代码语言:java
复制
    public static void main(String[] args) {
        final int tenNum = 123456789;
        // 转十进制
        System.out.print("\n转10进制:" + twoToTen(Integer.toBinaryString(tenNum)));
        System.out.print("\t" + eightToTen(Integer.toOctalString(tenNum)));
        System.out.println("\t" + sixteenToTen(Integer.toHexString(tenNum)));

        // 十进制转
        System.out.print("十进制转:" + tenToTwo(tenNum));
        System.out.print("\t" + tenToEight(tenNum));
        System.out.println("\t" + tenToSixTeen(tenNum));

        // 二进制转
        System.out.print("二进制转:" + twoToEight(Integer.toBinaryString(tenNum)));
        System.out.println("\t" + twoToSixteen(Integer.toBinaryString(tenNum)));

        // 转二进制
        System.out.print("转二进制:" + eightToTwo(Integer.toOctalString(tenNum)));
        System.out.println("\t" + sixteenToTwo(Integer.toHexString(tenNum)));
    }

    /**
     * 二进制转十进制
     */
    public static int twoToTen(String num) {
        int result = 0;
        int i = 0;
        while (!num.isEmpty()) {
            // 个位 * 2^i
            result += (int) (Integer.parseInt(num.substring(num.length() - 1)) * Math.pow(2, i));
            num = num.substring(0, num.length() - 1);
            i++;
        }
        return result;
    }

    /**
     * 八进制转十进制
     */
    public static int eightToTen(String num) {
        int result = 0;
        int i = 0;
        while (!num.isEmpty()) {
            // 个位 * 8^i
            result += (int) (Integer.parseInt(num.substring(num.length() - 1)) * Math.pow(8, i));
            num = num.substring(0, num.length() - 1);
            i++;
        }
        return result;
    }

    /**
     * 十六进制转十进制
     */
    public static int sixteenToTen(String num) {
        int result = 0;
        int i = 0;
        String str;
        int number;
        while (!num.isEmpty()) {
            str = num.substring(num.length() - 1);
            switch (str) {
                case "A":
                case "a":
                    number = 10;
                    break;
                case "B":
                case "b":
                    number = 11;
                    break;
                case "C":
                case "c":
                    number = 12;
                    break;
                case "D":
                case "d":
                    number = 13;
                    break;
                case "E":
                case "e":
                    number = 14;
                    break;
                case "F":
                case "f":
                    number = 15;
                    break;
                default:
                    number = Integer.parseInt(str);
                    break;
            }
            // 个位 * 16^i
            result += (int) (number * Math.pow(16, i));
            num = num.substring(0, num.length() - 1);
            i++;
        }
        return result;
    }

    /**
     * 十进制转二进制
     */
    public static String tenToTwo(int num) {
        StringBuilder result = new StringBuilder();
        while (num != 0) {
            // 个位
            result.append(num % 2);
            num /= 2;
        }
        return result.reverse().toString();
    }

    /**
     * 十进制转八进制
     */
    public static String tenToEight(int num) {
        StringBuilder result = new StringBuilder();
        while (num != 0) {
            // 个位
            result.append(num % 8);
            num /= 8;
        }
        return result.reverse().toString();
    }

    /**
     * 十进制转十六进制
     */
    public static String tenToSixTeen(int num) {
        StringBuilder result = new StringBuilder();
        while (num != 0) {
            // 个位
            switch (num % 16) {
                case 10:
                    result.append("A");
                    break;
                case 11:
                    result.append("B");
                    break;
                case 12:
                    result.append("C");
                    break;
                case 13:
                    result.append("D");
                    break;
                case 14:
                    result.append("E");
                    break;
                case 15:
                    result.append("F");
                    break;
                default:
                    result.append(num % 16);
                    break;
            }
            num /= 16;
        }
        return result.reverse().toString();
    }

    /**
     * 二进制转八进制
     */
    public static String twoToEight(String num) {
        StringBuilder result = new StringBuilder();
        while (num.length() >= 3) {
            result.append(twoToTen(num.substring(num.length() - 3)));
            num = num.substring(0, num.length() - 3);
        }
        if (!num.isEmpty()) {
            result.append(twoToTen(num));
        }
        return result.reverse().toString();
    }

    /**
     * 二进制转十六进制
     */
    public static String twoToSixteen(String num) {
        StringBuilder result = new StringBuilder();
        while (num.length() >= 4) {
            result.append(tenToSixTeen(twoToTen(num.substring(num.length() - 4))));
            num = num.substring(0, num.length() - 4);
        }
        if (!num.isEmpty()) {
            result.append(tenToSixTeen(twoToTen(num)));
        }
        return result.reverse().toString();
    }

    /**
     * 八进制转二进制
     */
    public static String eightToTwo(String num) {
        StringBuilder result = new StringBuilder();
        StringBuilder str;
        while (!num.isEmpty()) {
            str = new StringBuilder(tenToTwo(Integer.parseInt(String.valueOf(num.charAt(0)))));
            while (str.length() < 3) {
                str.insert(0, "0");
            }
            result.append(str);
            num = num.substring(1);
        }
        return result.toString();
    }

    /**
     * 十六进制转二进制
     */
    private static String sixteenToTwo(String num) {
        StringBuilder result = new StringBuilder();
        StringBuilder str;
        while (!num.isEmpty()) {
            str = new StringBuilder(tenToTwo(sixteenToTen(String.valueOf(num.charAt(0)))));
            while (str.length() < 4) {
                str.insert(0, "0");
            }
            result.append(str);
            num = num.substring(1);
        }
        return result.toString();
    }

二进制数

长度

0000 0001

1

2^1-1=1

0000 0010

2

2^2-1=3

0000 0100

4

2^3-1=7

0000 1000

8

2^4-1=15

0001 0000

16

2^5-1=31

0010 0000

32

2^6-1=63

0100 0000

64

2^7-1=127

1000 0000

128

2^8-1=255

1字节 = 8bit

1字节最大能存长度为-128~127(-2^7 ~ 2^7-1)的数值

原码、反码、补码

汇总

  1. 二进制的最高位是符号位
    1. 0--表示:N,取值范围:(0,∞),
    2. 1--表示:负数,取值范围:[-∞,0)
  2. N 的原码、反码、补码都一样(三码合一)
  3. 负数的反码 = 它的原码符号位不变,其他位取反
  4. 负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1
  5. 在计算机运算的时候,都是以补码的方式来运算的
  6. 当看运算结果的时候,要看他的原码

案例

源数据

十进制数

原码(二进制)

反码

补码

4

0100

0100

0100

2

0010

0010

0010

-2

1010

1101

1110

-5

1101

1010

1011

计算

样例

补码计算

补码结果

反码结果

原码结果

十进制

4 + 2

0100 + 0010

0110

0100

6

4 - 2

0100 + 1110

0010

0010

2

4 - 5

0100 + 1011

1111

1110

1001

-1

2-2

0010 + 1110

0000

0000

0

2-5

0010 + 1011

1101

1100

1011

-3

-2-5

1110 + 1011

1001

1000

1111

-7

4 - 2 ——> 0100 + 1110 = 1 0010 -2-5 ——> 1110 + 1011 = 1 1001 上述出现计算结果溢出,故忽略

位移运算符

名称

符号

介绍

按位与

&

两位全为1,结果为1,否则为0

按位或

|

两位有一个为1,结果为1,否则为0

按位异或

^

两位一个为0,一个为1时,结果为1,否则为0

按位取反

~

0->1,1->0

算数右移

>>

低位溢出,符号位不变,并用符号位补溢出的高位

算数左移

<<

符号位不变,低位补0

逻辑右移

>>>

也叫无符号右移,运算规则是:低位溢出,高位补0

没有 <<< 符号

案例

样例

原码

反码

补码

补码结果

反码结果

原码结果

十进制

2 & 3

0010 & 0011

0010

2

~-2

~1010

~1101

~1110

0001

1

~2

~0010

1101

1100

1011

-3

1 >> 2

0001 >> 2

0000

0

1 << 2

0001 << 2

0100

4

4 << 3

0100 << 3

0010 0000

32

1 >> 2 本质为:1 / 2 / 2 = 0

1 << 2本质为:1 2 2 = 4

4 << 3本质为:4 2 2 * 2 = 32

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 进制
    • 简介
      • 进制转换(Java)
        • java.lang.Integer
        • 自写
      • 原码、反码、补码
        • 汇总
        • 案例
      • 位移运算符
        • 案例
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
    http://www.vxiaotou.com