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