public String intToComplement(int num) { StringBuilder sb = new StringBuilder(); if (num >= 0) { for (int i = 0; i < 8; i++) { int temp = num % 16; if (temp >= 10) { sb.append((char) (temp - 10 + 'a')); } else { sb.append(temp); } num /= 16; } } else { int[] a = new int[32]; a[0] = 1; num = -num; //求出原码 for (int i = 0; i < 31; i++) { int temp = num % 2; a[31 - i] = temp; num /= 2; } //求反码 for (int i = 0; i < 31; i++) { if (a[31 - i] == 1) { a[31 - i] = 0; } else { a[31 - i] = 1; } } //求补码 int carry = 1; for (int i = 0; i < 31; i++) { int x = (carry + a[31 - i]) % 2; carry = (carry + a[31 - i]) / 2; a[31 - i] = x; } for (int i = 0; i < 8; i++) { int y = 0; for (int j = 0; j < 4; j++) { y += a[31 - 4 * i - j] * (int) Math.pow(2, j); } if (y >= 10) { sb.append((char)(y - 10 + 'a')); } else { sb.append(y); } } } sb.append("x0"); sb.reverse(); return sb.toString(); }
附带一个二进制、十进制、十六进制的表格
16进制 | 10进制 | 2进制 |
---|---|---|
0 | 0 | 0000 |
1 | 1 | 0001 |
2 | 2 | 0010 |
3 | 3 | 0011 |
4 | 4 | 0100 |
5 | 5 | 0101 |
6 | 6 | 0110 |
7 | 7 | 0111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
a | 10 | 1010 |
b | 11 | 1011 |
c | 12 | 1100 |
d | 13 | 1101 |
e | 14 | 1110 |
f | 15 | 1111 |