系列文章目录
关于二进制,八进制,十进制,十六进制间相互转换
前言
闲暇无事利用PB按机制转换规则,编写了两个整数类型相互转换的自定义函数,当然在日常编程中很少使用到,因为编译器会自动帮助我们完成转换工作。自己编程实现的目的主要是加深对于进制间转换的理解。
一、进制是什么?
进制也就是进位计数制,是人为定义的带进位的计数方法。
对于任何一个数,我们可以用不同的进位制来表示。比如:十进数57(10),可以用二进制表示为111001(2),也可以用五进制表示为212(5),也可以用八进制表示为71(8)、用十六进制表示为39(16),它们所代表的数值都是一样的。
对于任何一种进制---X进制,就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。
二、实现算法
1.二进制、八进制、十六进制转十进制算法
代码如下(示例):
'-------------------------------------------------------------------------
' 整数型2,8,16进制转10进制
'-------------------------------------------------------------------------
FUNCTION OtherToDecimal(BYVAL bType AS BYTE, BYVAL Value AS STRING) AS QUAD
LOCAL i AS BYTE
LOCAL n AS BYTE
LOCAL bi AS BYTE
LOCAL a AS LONG
LOCAL length AS BYTE
LOCAL sValue AS STRING
LOCAL p AS BYTE PTR
IF bType=2 OR bType=8 OR bType=10 OR bType=16 THEN
GOTO calcu
ELSE
FUNCTION = 0
EXIT FUNCTION
END IF
calcu:
a = 0
Value = REMOVE$(Value, $SPC)
p = STRPTR(Value)
length = LEN(Value)-1
FOR i=0 TO length
bi = @p[length-i]
SELECT CASE bi
CASE 48 TO 57
n = VAL(CHR$(bi)) '取得位值
CASE 65 TO 102 '针对16进制9以上的数字转换为对应字母符号
IF bi=65 OR bi=97 THEN n=10 'A
IF bi=66 OR bi=98 THEN n=11 'B
IF bi=67 OR bi=99 THEN n=12 'C
IF bi=68 OR bi=100 THEN n=13 'D
IF bi=69 OR bi=101 THEN n=14 'E
IF bi=70 OR bi=102 THEN n=15 'F
END SELECT
a = a + (bType^i)*n '进制运算
NEXT i
FUNCTION = a
END FUNCTION
函数调用实例如下:
'--------------------------------
'二进制转十进制,字符形式回显
'--------------------------------
LOCAL s AS STRING
LOCAL b AS LONG
s = "110110"
b = OtherToDecimal(2, s)
MSGBOX STR$(b)
'返回结果 54
'--------------------------------
'八进制转十进制,字符形式回显
'--------------------------------
LOCAL s AS STRING
LOCAL b AS LONG
s = "127"
b = OtherToDecimal(8, s)
MSGBOX STR$(b)
'返回结果 87
'--------------------------------
'十六进制转十进制,字符形式回显
'--------------------------------
LOCAL s AS STRING
LOCAL b AS LONG
s = "45CF"
b = OtherToDecimal(16, s)
MSGBOX STR$(b)
'返回结果 17871
2.十进制转二进制、八进制、十六进制算法
代码如下(示例):
'-------------------------------------------------------------------------
' 整数型10进制转2,8,16进制整形
'-------------------------------------------------------------------------
FUNCTION DecimalToOther(BYVAL bType AS BYTE, BYVAL Value AS QUAD) AS STRING
LOCAL bi AS BYTE
LOCAL length AS BYTE
LOCAL s AS STRING
LOCAL sValue AS STRING
IF bType=2 OR bType=8 OR bType=16 THEN
GOTO calcu
ELSE
FUNCTION = ""
EXIT FUNCTION
END IF
calcu:
s = ""
sValue = ""
WHILE Value>0 '直到商数为0则退出循环
bi = (Value MOD bType) '取余数
Value = FIX(Value/bType) '取商数
SELECT CASE bi
CASE 10 TO 15
IF bi=10 THEN s="A"
IF bi=11 THEN s="B"
IF bi=12 THEN s="C"
IF bi=13 THEN s="D"
IF bi=14 THEN s="E"
IF bi=15 THEN s="F"
CASE ELSE
s = STR$(bi)
END SELECT
sValue = sValue + s
WEND
sValue = REMOVE$(STRREVERSE$(sValue),$SPC)
FUNCTION = sValue
END FUNCTION
'--------------------------------
'十进制转二进制,字符形式回显
'--------------------------------
LOCAL s AS STRING
LOCAL b AS LONG
b = 125
s = DecimalToOther(2, b)
MSGBOX s
'返回结果 1111101
'--------------------------------
'十进制转八进制,字符形式回显
'--------------------------------
LOCAL s AS STRING
LOCAL b AS LONG
b = 125
s = DecimalToOther(8, b)
MSGBOX s
'返回结果 175
'--------------------------------
'十进制转十六进制,字符形式回显
'--------------------------------
LOCAL s AS STRING
LOCAL b AS LONG
b = 125
s = DecimalToOther(16, b)
MSGBOX s
'返回结果 7D
总结
二进制:它由两个数码0,1组成,二进制数运算规律是逢二进一。
八进制:它由两个数码0、1、2、3、4、5、6、7组成,八进制数运算规律是逢八进一。
十六进制:采用的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。其中A-F分别表示十进制数字10-15.十六进制数的技术规则是逢十六进一。