首页 > java基础 > 输出二进制、八进制、16进制字符串的算法

输出二进制、八进制、16进制字符串的算法

2008年10月26日

首先建立矩阵图,让我们可以针对不同的数字,取不同的字符,如果要输入10的16进制,只需要digits[10],这样就可以将数字与字符对应起来:

  1. final static char[] digits = {
  2.  0 , 1 , 2 , 3 , 4 , 5 ,
  3.  6 , 7 , 8 , 9 , a , b ,
  4.  c , d , e , f
  5. };

接下来的思路是,任意举一个数字,然后将它在草稿纸上写成二进制
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,依次循环。算法如下:

  1. private static String toUnsignedString(int i, int shift) {//shift就是移的位数,二进制1,8进制3,16进制4
  2.     char[] buf = new char[32];
  3.     int charPos = 32;
  4.     int radix = 1 << shift;
  5.     int mask = radix - 1;
  6.     do {
  7.         buf[--charPos] = digits[i & mask];
  8.         i >>>= shift;
  9.     } while (i != 0);
  10.  
  11.     return new String(buf, charPos, (32 - charPos));
  12.     }

上面是对于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.

java基础 , , ,

  1. 目前还没有任何评论.
  1. 目前还没有任何 trackbacks 和 pingbacks.