靠函数 十进制变二进制
数字职场
我们在接触程序开发的入门教程时就会学如何将十进制转换为二进制,十进制、二进制、八进制、十六进制之间的相互转换是各种计算机考试的必考题目之一,在软件公司的招聘考试中出现这种题目就有点像厨艺比拼中的炒鸡蛋饭,虽然大家都会,但炒出来的质量却大相径庭,最能够检验一个厨师的真功夫。下面我们以北京环亚运商的十进制转换二进制的题目为例,说说如何解题才能博得主考官的好感。
题目:写一个程序将输入的任意正整数转换为它所对应的二进制数码并输出。
剖析:这道考题中注明是正整数,不涉及小数。十进制整数转换为二进制整数采用“除2取余,逆序排列”法:用2去除十进制整数,可以得到一个商和余数,再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。例如45/2=22余1,22/2=11余0,11/2=5余1,5/2=2余1,2/2=1余0,1/2=0余1(见图)。

采用inttoBin2函数解题
采用inttoBin2函数解题的思路是把正整数除以2后再乘以2,如果相同则表示能除尽,余数为0,否则为1,result的值为余数加上result(字符串相加),再把正整数除以2后乘以2进行判断,直到正整数为0。代码如下:
function TForm1.inttoBin2(i: integer): string;
begin
while i <>0 do
begin
if i=(i div 2)*2 then
result:='0'+result
else
result:='1'+result;
i:=i div 2;
end;
end;
小知识>>
十进制数与非十进制数之间的转换
把一个十进制数转换成非十进制数(基数记作R)分成两步,整数部分转换时采用“除R取余法”,小数部分转换时采用“乘R取整法”。非十进制数(基数记作R,第j个数位的位权记作Rj)转换成十进制数的方法是按权展开求其和。
二进制数与八进制数之间的转换
二进制数转换成八进制数的方法是以小数点分界,整数部分自右向左、小数部分自左向右,每三位一组,不足三位时,整数部分在高位左边补0,小数部分在低位右边补0,然后写出对应的八进制数码。
八进制数转换成二进制数的方法是用八进制数码对应的三位二进制数代替八进制数码本身即可。
二进制数与十六进制数之间的转换
二进制数转换成十六进制数的方法是以小数点分界,整数部分自右向左、小数部分自左向右,每四位一组,不足四位时,整数部分在高位左边补0,小数部分在低位右边补0,然后写出对应的十六进制数码。十六进制数转换成二进制数的方法是用十六进制数码对应的四位二进制数代替十六进制数码本身即可。
我的建议
进制之间的转换在行业中应用非常广泛,例如电文数据的交换就需要把十进制转换为二进制。在游戏开发过程中,进制之间的转换更是必不可少。虽然我们都能掌握进制转换的方法,但在面试过程中我们仍然要想尽办法来“与众不同”,这样才能引起主考官的注意。
采用inttoBin2函数解题是大家都可以想到的,如果使用Format函数解题,会让主考官眼前一亮,因为Format函数编写的代码相对而言更精简一些。代码如下:
function TForm1.inttoBin(i: integer): string;
begin
while i <>0 do
begin //i mod 2取模,再使用format格式化
result:=Format('%d'+result,[i mod 2]);
i:=i div 2 ;
end;
end;