XhstormR


On a dark desert highway Cool wind in my hair


进制转换

Updated on 2016-09-09

单位

二进制

  • 0,1
  • 开头用 0b 表示

八进制

  • 0,1,2,3,4,5,6,7
  • 开头用 0 表示

十进制

  • 0,1,2,3,4,5,6,7,8,9

十六进制

  • 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
  • 开头用 0x 表示

表示 - 235

二进制 - 11101011

八进制 - 353

十进制 - 235

十六进制 - eb

二进制

位运算

原码

按绝对值大小转换成的二进制数称为原码(正数)。

14:00000000 00000000 00000000 00001110(正数 +14

反码

原码 取反 称为反码。

14:11111111 11111111 11111111 11110001

补码

反码 加1 称为补码(负数)。

14:11111111 11111111 11111111 11110010(负数 -14

Code

Integer.toBinaryString(57);     10 ➜ 2
Integer.toOctalString(57);     10 ➜ 8
Integer.toHexString(57);     10 ➜ 16

Integer.toString(57, 2);     10 ➜ 2
Integer.toString(57, 8);     10 ➜ 8
Integer.toString(57, 16);     10 ➜ 16

Integer.parseInt("1101", 2);     2 ➜ 10
Integer.parseInt("376", 8);     8 ➜ 10
Integer.parseInt("ff", 16);     16 ➜ 10

Integer.toString(9999, 26);     10 ➜ 26
Integer.parseInt("ekf", 26);     26 ➜ 10

-------------------------------------------------------

int i1 = 14;           14
int i2 = ~14 + 1;     -14

-------------------------------------------------------

public class Test {
    private static void radix(int num, int radix) {     显示任意进制转换过程
        for (; ; ) {
            int i = num;
            int i2 = num % radix;
            num /= radix;
            System.out.println(i + "\t/" + radix + "=" + num + "\t" + i2);
            if (num == 0) {
                break;
            }
        }
    }

    private static void int2BinaryFormat(int num) {     转为 2 进制并格式化
        String string = Integer.toString(num, 2);
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < 32 - string.length(); i++) {
            stringBuilder.append("0");
        }
        stringBuilder.append(string);
        for (int i = 0; i < 3; i++) {
            stringBuilder.insert(9 * i + 8, " ");
        }
        System.out.println(stringBuilder);
    }

    private static byte[] int2Bytes(int num) {     int 转为 字节数组
        byte[] bytes = new byte[4];

        bytes[0] = ((byte) ((num >> 0 * 8) & 0xff));
        bytes[1] = ((byte) ((num >> 1 * 8) & 0xff));
        bytes[2] = ((byte) ((num >> 2 * 8) & 0xff));
        bytes[3] = ((byte) ((num >> 3 * 8) & 0xff));

        for (int i = 0; i < bytes.length; i++) {     简化后
            bytes[i] = ((byte) ((num >> i * 8) & 0xff));
        }

        System.out.println(Arrays.toString(bytes));
        return bytes;
    }

    private static void bytes2Int(byte[] bytes) {     字节数组 还原为 int
        int result = 0;

        result += (bytes[0] & 0xff) << 0 * 8;     逆操作
        result += (bytes[1] & 0xff) << 1 * 8;
        result += (bytes[2] & 0xff) << 2 * 8;
        result += (bytes[3] & 0xff) << 3 * 8;

        for (int i = 0; i < bytes.length; i++) {     简化后
            result += (bytes[i] & 0xff) << i * 8;
        }

        System.out.println(result);
    }

    public static void main(String[] args) {
        Test.radix(235, 8);
        System.out.println("----");

        Test.int2BinaryFormat(8143);
        System.out.println("----");

        byte[] c = Test.int2Bytes(8143);
        System.out.println("----");

        Test.bytes2Int(c);
    }
}
----
输出:
235	/8=29	3
29	/8=3	5
3	/8=0	3
----
00000000 00000000 00011111 11001111
----
[-49, 31, 0, 0]
----
8143

-------------------------------------------------------

int i1 = 0b1111;   15  (2  进制)
int i2 =  01111;   585 (8  进制)
int i3 =   1111;   1111(10 进制)
int i4 = 0x1111;   4369(16 进制)

-------------------------------------------------------

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] ints = {5, 10};
        System.out.println(Arrays.toString(ints));
        swap(0, 1, ints);
        System.out.println(Arrays.toString(ints));
    }

    private static void swap(int x, int y, int[] ints) {     使用异或运算进行交换
        ints[x] = ints[x] ^ ints[y];
        ints[y] = ints[x] ^ ints[y];
        ints[x] = ints[x] ^ ints[y];
    }
}
----
输出:
[5, 10]
[10, 5]
TOP