大一寒假的时候我在学校里学C语言的补码时候学会了一种十进制换成二进制的方法,不知道学计算机的是不是也是这么算的,感觉比高中数学课教的那除2取余的方法快多了,而且容易掌握和不需要笔算。具体方法如下,我会先用例子演示:
方法步骤就是先把十进制换算成16进制,再从16进制换算成二进制。(在我看来,十进制转成16进制很简单只要口算就可以了,是以这为基础的。别说你不会。。)
eg. (十进制) 35 = 16 * 2 + 3 --> (十六进制) 0x23 -->( 二进制) 0010 0011
eg. 100 = 16 * 6 + 4 --> 0x64 -->0110 0100
eg. 1024 = 16 * 64 --> (需要进位64 = 16*4) 0x400 --> 0100 0000 0000
看出规律了吗?因为16进制的每一位可以对应4位的二进制数,四位二进制数分别是8 4 2 1,比如说,16进制的3,就是2+1,就是0011,16进制的5,就是4+1,就是0101,意思就是说每一位16进制数都可以表示为8,4,2,1这四个数字的加和,若使用到,则该位为1不使用为0。我这么说可能十分不清楚,但也懒得去想更好的表达方法了,如果有人看不懂再说。
那么按照这个规律,你现在可以来尝试算一下十进制的307等于多少。下面我会给出答案过程:
307 < 16 * 20 , 307 = 16 * 19 + 3 --> (19 = 16 * 1 + 3) 0x133 --> 0001 0011 0011
是不是一样呢? 8 4 2 1,你会算了吗?是不是比拿笔算什么余数方便而且快速多了,而且只要你熟练了之后,任何数拿来都可以快速进行换算,虽然二进制数好像没什么用,但看起来有点儿刁有没有哈?还可以用此来进行通信。。。呵呵呵= =
最后,再检验一下,我们可以反过来算一遍,比如随便拿一个二进制数,0101 1111 1110 这个数换成十进制是多少呢?你肯定不会再拿笔来算各位成于2的n次方的加和吧,现在完全可以通过16进制来进行中转了,0101 --> 0x 5, 1111 --> 0x F, 1110 --> 0x E 所以其16进制就是 0x5FE = 5 * 16^2 + 15 * 16 + 14 = 1534, 是不是等于2^10 + 2^8 + 2^7 + 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 = 1534来得快呢?
另外,要赶着去做实验了,所以以下直接贴出Java输出二进制的代码:(和语言无关,用C和C++也都可以一样这样写的),大家可以用下面的代码来检验上面的方法
public class Binary {
public static void main(String[] args) {
//我自己写的方法,使用位运算符进行二进制转换
int theNumber = 0xFFFFFFFF;//java中int类型占4个字节,所以以下的j的初始值为31
for (int j = 31; j >= 0; j--) {
if (((theNumber >> j) & 1) == 1) {
System.out.print("1");
if (j%4 == 0) {
System.out.print(" ");//4个数空一格
}
}
else {
System.out.print("0");
}
}
//使用Java自带的类进行二进制转换
System.out.print("\n" + Integer.toBinaryString(theNumber));
}
}