package LeeCode;
/**
* @ClassName ToHex
* @Description 給定一個整數,編寫一個算法將這個數轉換爲十六進制數。對於負整數,我們通常使用 補碼運算 方法。
* 注意:
* 十六進制中所有字母(a-f)都必須是小寫。
* 十六進制字符串中不能包含多餘的前導零。如果要轉化的數爲0,那麼以單個字符'0'來表示;對於其他情況,十六進制字符串中的第一個字符將不會是0字符。
* 給定的數確保在32位有符號整數範圍內。
* 不能使用任何由庫提供的將數字直接轉換或格式化爲十六進制的方法。
* @Author Kingsley
* @Date 2020/3/12 15:57
* @Version 1.0
**/
public class ToHex {
//正數可以,負數就不行了
public static String toHex(int num) {
if(num == 0)
return "0";
char[] c = {'0','1', '2','3','4', '5', '6', '7','8','9','a','b','c','d','e','f'};
StringBuilder sb = new StringBuilder();
while (num != 0){
sb.insert(0, c[num % 16]);
num /= 16;
}
return sb.toString();
}
//正負數都要可以的算法,0xf 0x代表這是16進制的數,f代表15,所以0xf就是15
public static String toHexDemo(int num) {
if(num == 0)
return "0";
char[] c = {'0','1','2','3','4', '5', '6', '7','8','9','a','b','c','d','e','f'};
StringBuilder sb = new StringBuilder();
int tmp = 0;
while (num != 0){
//num和0xf做與運算就是把num的二進制形式的後四位取出來,表示成16進制中的數。
//可舉例 100的二進制: 1100100 0xf的二進制 : 0001111 與運算的結果就是0000100
tmp = (num & 0xf);
sb.insert(0, c[tmp]);
//取了四位之後,就將num右移四位
//按位右移補零操作符。左操作數的值按右操作數指定的位數右移,移動得到的空位以零填充。
//無符號右移,不論正負,高位均補0
num >>>=4;
//>> 有符號右移,原數是正數 高位補0;是負數,高位補1 有符號數高位0代表正數,高位1代表負數
}
return sb.toString();
}
public static void main(String[] args) {
int num = -10;
String res = toHexDemo(num);
System.out.println(res);
}
}
代碼即解釋,記錄一番關於位運算以及補碼,有符號數的概念
1.正數的補碼是它本身
2.負數的補碼是正數的補碼+1;且最高位爲1
3.>>>運算符是無符號右移,高位均補0。
補碼:
- 正數
正整數的補碼是其二進制表示,與原碼相同 [3] 。
例:+9的補碼是00001001。(備註:這個+9的補碼是用8位2進制來表示的,補碼錶示方式很多,還有16位二進制補碼錶示形式,以及32位二進制補碼錶示形式,64位進制補碼錶示形式等。每一種補碼錶示形式都只能表示有限的數字。) - 負數
求負整數的補碼,將其原碼除符號位外的所有位取反(0變1,1變0,符號位爲1不變)後加1 [4] 。
同一個數字在不同的補碼錶示形式中是不同的。比如-15的補碼,在8位二進制中是11110001,然而在16位二進制補碼錶示中,就是1111111111110001。以下都使用8位2進制來表示。
例:求-5的補碼。
-5對應正數5(00000101)→所有位取反(11111010)→加1(11111011)
所以-5的補碼是11111011。 - 0的補碼
數0的補碼錶示是唯一的 [3] 。
[+0]補=[+0]反=[+0]原=00000000
[ -0]補=11111111+1=00000000