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の補数の負の数は2の補数正数+ 1であり、そして最上位ビットが1である
。3 >>>符号なし右シフト演算、0は高いです。
補足:
- 正の
補数バイナリ表現、元のコード[3]と同じである整数。
例:9補数は00001001です。(注:これは+9補体8ビットのバイナリは、多くの補数表現、ならびに16ビットの補数表現、及び補数64ビットの32ビットの補数表現で表されコード表現など。各2の補数表現は、限られた数で表すことができます。) - 負の
すべてのビットのビット反転した後、元のコードシンボルに加えて、シーク補体負の整数、プラス1 [4](1、1 0 0になるとなるが、符号ビットは一定です)。
別の補数表現内の同じ番号が異なっています。-15補体ような、それは8ビットのバイナリ11110001にあるが、16ビットの2の補数バイナリ表現が1111111111110001です。以下に表すために8ビットのバイナリです。
例:補数-5。
-5正数5(00000101)→すべてのビット(11111010)→プラス1(11111011)に対応する
ので-5補体は11111011です。 - 0補完
0の補数表現の数のみである[3]。
[+0]補体= [0 +]トランス= [+ 0] = 00000000元
[-0]補体00000000 = 11111111 + 1 =