输出二进制、八进制、16进制字符串的算法
首先建立矩阵图,让我们可以针对不同的数字,取不同的字符,如果要输入10的16进制,只需要digits[10],这样就可以将数字与字符对应起来:
- final static char[] digits = {
- ‘0‘ , ‘1‘ , ‘2‘ , ‘3‘ , ‘4‘ , ‘5‘ ,
- ‘6‘ , ‘7‘ , ‘8‘ , ‘9‘ , ‘a‘ , ‘b‘ ,
- ‘c‘ , ‘d‘ , ‘e‘ , ‘f‘
- };
接下来的思路是,任意举一个数字,然后将它在草稿纸上写成二进制
0100111010111100101
我们按照3位3位的划分开来(准备8进制的取法),之后每3位取其值,就是8进制的表示了。
0 100 111 010 111 100 101
0 4 7 2 7 4 5
我们按照4位4位的划分,之后每4位取其值,就是16进制的表示了。
010 0111 0101 1110 0101
2 7 5 E 5
我们现在要做的就是要用一个掩码,去取我们要取的数字,比如以16进制为例,先用掩码0000000 1111和我们的数字去做与操作,得出的就是5,之后让我们的数字右移4位(用>>>操作符),再用掩码做与操作,得出E,依次循环。算法如下:
- private static String toUnsignedString(int i, int shift) {//shift就是移的位数,二进制1,8进制3,16进制4
- char[] buf = new char[32];
- int charPos = 32;
- int radix = 1 << shift;
- int mask = radix - 1;
- do {
- buf[--charPos] = digits[i & mask];
- i >>>= shift;
- } while (i != 0);
- return new String(buf, charPos, (32 - charPos));
- }
上面是对于int算法,其他数据类型也一样
float 4 字节 32位IEEE 754单精度
double 8 字节 64位IEEE 754双精度
byte 1字节 -128到127
short 2 字节 -32,768到32,767
int 4 字节 -2,147,483,648到2,147,483,647
long 8 字节 -9,223,372,036,854,775,808到9,223,372,036, 854,775,807
char 2 字节 整个Unicode字符集
boolean 1 位 True或者false
另外需要补充的基础知识是负数的二进制形式
计算机中的负数是以补码形式来存放的,出发点是计算机中没有减法,只有加法,那么如何让一个正数与一个负数去相加呢? 我们举个例子:8+(-6)= (8 + (10-6))%10 = 2
这里我们先对-6进行一个转换,让它和模相加,取出一个4,让4和8去加,然后取模,得出2.(这里的模是10)。
18-9 = (18 + 91)%100 = 9
780-50 = (780+950)%1000 = 730
这其中的规律,相信大家一定可以猜到了。
同样,计算机中的负数,也是这么表示的,比如-1,就是11111111111111111111111111111111,一旦与1去相加,刚好进位到溢出为止,得到全部的0.