我以前没有在编程课上学过这个,但现在我需要知道它。有哪些好的资源可以学习这些数字以及如何转换它们?我几乎会像时间表一样记住这些。
7 回答
在我们日常的十进制系统中,基数或基数是10
。数字系统的基数告诉我们使用了多少不同的数字。在十进制系统中,我们使用数字0
到9
.
数字的意义是radix ^ i
,其中i
数字的位置从右开始,从零开始。
十进制数6789
分解:
6 7 8 9 radix ^ i
| | | | --------------
| | | +-- ones 10 ^ 0 = 1
| | +----- tens 10 ^ 1 = 10
| +-------- hundreds 10 ^ 2 = 100
+----------- thousands 10 ^ 3 = 1000
ones tens hundreds thousands
-----------------------------------------------
(9 * 1) + (8 * 10) + (7 * 100) + (6 * 1000)
= 9 + 80 + 700 + 6000
= 6789
这个方案将帮助我们理解任何十进制数的数字系统。
十六进制的基数是16
,所以我们需要使用额外的数字A...F
来表示10...15
。CDEFh
让我们以类似的方式分解十六进制数:
C D E F radix ^ i
| | | | --------------
| | | +-- ones 16 ^ 0 = 1
| | +----- sixteens 16 ^ 1 = 16
| +-------- 256:s 16 ^ 2 = 256
+----------- 4096:s 16 ^ 3 = 4096
ones sixteens 256:s 4096:s
-----------------------------------------------
(Fh * 1) + (Eh * 16) + (Dh * 256) + (Ch * 4096)
= (15 * 1) + (14 * 16) + (13 * 256) + (12 * 4096)
= 15 + 224 + 3328 + 49152
= 52719
我们刚刚将数字转换CDEFh
为十进制(即将 base 转换16
为 base 10
)。
在二进制系统中,基数是2
,所以只使用数字0
和1
。这是二进制数1010b
到十进制数的转换:
1 0 1 0 radix ^ i
| | | | --------------
| | | +-- ones 2 ^ 0 = 1
| | +----- twos 2 ^ 1 = 2
| +-------- fours 2 ^ 2 = 4
+----------- eights 2 ^ 3 = 8
ones twos fours eights
-----------------------------------------------
(0 * 1) + (1 * 2) + (0 * 4) + (1 * 8)
= 0 + 2 + 0 + 8
= 10
八进制系统 - 同样的事情,基数是8
,数字0...7
正在使用中。八进制04567
转十进制:
4 5 6 7 radix ^ i
| | | | --------------
| | | +-- ones 8 ^ 0 = 1
| | +----- eights 8 ^ 1 = 8
| +-------- 64:s 8 ^ 2 = 64
+----------- 512:s 8 ^ 3 = 512
ones eights 64:s 512:s
-----------------------------------------------
(7 * 1) + (6 * 8) + (5 * 64) + (4 * 512)
= 7 + 48 + 320 + 2048
= 2423
因此,在数字系统之间进行转换就是简单地改变radix。
要了解按位运算符,请参阅http://www.eskimo.com/~scs/cclass/int/sx4ab.html。
这: http: //members.tripod.com/numeric_systems/似乎是一个好的开始。
顺便说一句,到处都有这方面的信息,你只需要寻找它。
使用谷歌:
http://www.google.com/search?q=0b11110000+to+hex
http://www.google.com/search?q=0b11110000+to+decimal
http://www.google.com/search?q=0b11110000+to+octal
http://www.google.com/search?q=4232+to+binary
http://www.google.com/search?q=4232+to+hex
http://www.google.com/search?q=4232+to+octal
http://www.google.com/search?q=0xaf0e23+to+decimal
http://www.google.com/search?q=0xaf0e23+to+binary
http://www.google.com/search?q=0xaf0e23+to+octal
数字系统的基本概念是这样的:一个数字是它的每个数字的总和乘以它的底数的位置的幂。
十六进制、十进制、八进制和二进制都是数字系统的“基础”,但它们计数相同。你已经知道十进制,所以它是最容易解释的:
4232 = 4 * 10^3 + 2 * 10^2 + 3 * 10^1 + 2 * 10^0
3210 <- the base that you raise each of the above digits to
这个确切的原则适用于每个基本系统。
二进制:
0b11110000 = 1 * 2^7 + 1 * 2^6 + 1 * 2^5 + 1 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 0 * 2^0
76543210 <- the base that you raise each of the above digits to
十六进制(十六进制):
0xaf0e23 = 10 * 16^5 + 15 * 16^4 + 0 * 16^3 + 14 * 16^2 + 2 * 16^1 + 3 * 16^0
543210 <- the base that you raise each of the above digits to
十六进制确实是唯一不直观的通用基础,因为它使用字母字符来描述值 10、11、12、13、14 和 15,使用字母 a、b、c、d、e 和f 分别代替。
我们使用二进制、八进制和十六进制,因为二进制是计算机的语言(请记住,数字线可以有电流也可以没有电流(值 1 或 0))。每个十六进制字符准确描述四个二进制数字,而一个八进制字符描述三个二进制数字。十六进制比八进制更常用。
0b0000 = 0x0 = 0
0b0001 = 0x1 = 1
0b0010 = 0x2 = 2
0b0011 = 0x3 = 3
0b0100 = 0x4 = 4
0b0101 = 0x5 = 5
0b0110 = 0x6 = 6
0b0111 = 0x7 = 7(this is as far as octal goes)
0b1000 = 0x8 = 8
0b1001 = 0x9 = 9
0b1010 = 0xa = 10
0b1011 = 0xb = 11
0b1100 = 0xc = 12
0b1101 = 0xd = 13
0b1110 = 0xe = 14
0b1111 = 0xf = 15
十六进制数字的大写并不重要。就数字系统而言,您要记住的最重要的事情是上表。将长的十六进制或二进制数字转换为十进制时,通常应该使用 Google,但如果您知道上面的表格,那么您将不需要 Google 来处理许多短字符串。
作为练习,我还建议您使用您选择的语言编写转换方法,以便从一个基本系统转换为另一个。它们是简单的迭代器,有助于巩固您脑海中的概念。我喜欢这样写它们:decimal_ot_binary(binarynum)
而不是binary_to_decimal(binarynum)
. 然后你可以合理地嵌套它们:int x = decimal_ot_hex(hex_ot_binary(binary_ot_decimal(40001)));
现在,任何时候你在表格中看到一个十六进制数字,0x?????
你都会知道它只是一串二进制数字的表示。只需将十六进制中的每个字符转换为相应的二进制数字,如上。
二进制、八进制和十六进制之间的转换非常简单。
binary <=> octal: three binary digits <=> one octal digit
binary <=> hex: four binary digits <=> one hex digit
octal <=> hex: four octal digits <=> three hex digits
(by way of binary, if necessary)
这些很容易,因为二进制、八进制和十六进制的基数都是 2 的幂。诀窍在于十进制和其他三个之间,因为 10(十进制的基数)具有 5 的讨厌因子。
其他几个答案显示了如何从二进制、八进制和十六进制转换为十进制。我被教导从十进制到另一个基数的算法是不断地除以基数并读出余数作为从右到左的答案。例如,下面是如何用十六进制表示 227:
n n / 16 remainder
--- ------ ---------
227 14 3
14 0 14 (=E)
所以答案是E3。
使用可以为您完成所有艰苦工作的基数转换工具,学习转换数字基数(也称为基数)要容易得多。
这样,您可以通过将一堆数字与不同的基数转换来快速学习,并立即看到转换的结果。
使用这个基数转换器——http: //www.sooeet.com/math/base-converter.php
将十进制数字列表转换为二进制、八进制和十六进制(一次一个数字)。
以下是两个十进制数字列表,可帮助您入门:
1、2、4、8、16、32、64、128、256、512、1024、2048、4096、8192、16384、32768、65536
0、1、3、7、15、31、63、127、255、511、1023、2047、4095、8191、16383、32767、65535
这两个列表看起来很相似,但是当您将它们转换为二进制、八进制和十六进制时,会产生非常不同的结果。试试看。
要使用此数字基数转换器,请键入一个数字,或将上述列表中的任何数字复制并粘贴到“Base-10”框中,然后按键盘上的 Enter 或 Return。您输入的数字将从 base-2 和 base-36 转换为二进制 (base-2)、八进制 (base-8) 和十六进制 (base-16),以及许多其他数字基数(基数)。
如果您想更好地了解基数转换,请阅读每个基数框旁边的帮助弹出窗口,以了解每个基数的内部工作原理。
现在,尝试通过替换二进制、八进制或十六进制“数字”来更改从转换上述列表中获得的二进制、八进制和十六进制数字。
例如:十进制 15 = 二进制 1111
现在,在二进制结果 (1111) 中,将 1 个二进制数字(位)中的任何一个替换为零 (0),然后按键盘上的 Enter 或 Return。
在此示例中:二进制 1101 = 十进制 13
您可以看到二进制数中从右数第二位的权重为十进制的 2。
像这样继续试验,用十进制、二进制、八进制和十六进制数字转换,你很快就会掌握这个主题。
这是我在 Python 中的代码,用于从任意到任意的数字转换(2、8、10、16)。它可能会帮助你。
class Conversion:
def __init__(self):
pass
def dec_to_any(self, data, base):
return base(data)
def any_to_dec(self, data, base):
return int(data, base)
def main():
menu ={1: 'dec to bin', 2:'dec to oct', 3:'dec to hex', 4: 'bin to dec', 5: 'bin to oct', 6:'bin to hex',
7: 'oct to bin', 8: 'oct to dec', 9: 'oct to hex', 10: 'hex to bin', 11: 'hex to oct', 12: 'hex to dec'}
target_base = {'bin': bin,'oct': oct, 'hex': hex}
src_base = {'bin': 2,'oct': 8, 'hex': 16}
choice=int(input(str(menu)+"\nEnter your choice: "))
src, target = menu[choice].split()[0], menu[choice].split()[2]
c=Conversion()
val =input("Enter the value :")
if(src == "dec"):
val =int(val)
value= c.dec_to_any(val, target_base[target])
print('Value is :', value)
elif(target == "dec"):
value = c.any_to_dec(val, src_base[src])
print('Value is :', value)
else:
val = c.any_to_dec(val, src_base[src])
value= c.dec_to_any(val, target_base[target])
print('Value is :', value)
if __name__ == '__main__':
main()
十进制、十六进制、八进制、二进制和多基数转换器
也许玩这个内联代码段可能会有所帮助......
这个小 javascript 片段可以以各种方式转换:
您可以在其中一个输入字段中键入任何有效条目,它们将立即转换为彼此的字段。
在下面的每个字段中依次输入示例10
或100
(或尝试1767707668033969
在整数字段中输入;)...
function doChange(ent) {
var val=ent.target.value;
if (ent.target.id == 'hex') val=parseInt(val, 16);
else if (ent.target.id == 'oct') val=parseInt(val, 8);
else if (ent.target.id == 'bin') val=parseInt(val, 2);
else if (ent.target.id == 'sel') val=parseInt(val,
document.getElementById('radix').value);
document.getElementById('int').value=(val*1).toString(10);
document.getElementById('hex').value=(val*1).toString(16).toUpperCase();
document.getElementById('oct').value=(val*1).toString( 8);
document.getElementById('bin').value=(val*1).toString( 2);
document.getElementById('sel').value=(val*1).toString(
document.getElementById('radix').value).toUpperCase();
}
function selRadix(ent) {
var radix=ent.target.value;
document.getElementById('sel').value=
(1*document.getElementById('int').value).
toString(radix).toUpperCase();
}
function wStart() {
var ent=document.getElementsByTagName('input');
for (var i=0;i<ent.length;i++) {
ent[i].addEventListener('keyup',doChange);
ent[i].addEventListener('change',doChange);
};
ent=document.getElementById('radix');
for (i=2;i<36;i++) ent.innerHTML+="<option>"+i+"</option>";
ent.innerHTML+='<option selected="true">36</option>';
ent.addEventListener('change',selRadix);
}
setTimeout(wStart,300);
body { font-family: sans; font-size: .8em; margin: 0pt; padding:1% }
input#int { width: 12%; }
input#hex { width: 10%; }
input#oct { width: 18%; }
input#bin, input#sel { width: 32%; }
<div>
Int<input id="int"></input>
Hex<input id="hex"></input>
Oct<input id="oct"></input>
Bin<input id="bin"></input>
<hr />
Radix: <select id="radix"></select>
<input id="sel"></input>
</div>