开发者

How do alternative positional base systems (hexadecimal, octal, binary) work? How do I convert them to decimal?

I haven't learned this in programming class bef开发者_如何学运维ore, but now I need to know it. What are some good resources for learning these numbers and how to convert them? I pretty much am going to memorise these like the times table.


In our everyday decimal system, the base number, or radix is 10. A number system's radix tells us how many different digits are in use. In decimal system we use digits 0 through 9.

The significance of a digit is radix ^ i, where i is digit's position counting from right, starting at zero.

Decimal number 6789 broken down:

 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

This scheme will help us understand any number system in terms of decimal numbers.


Hexadecimal system's radix is 16, so we need to employ additional digits A...F to denote 10...15. Let's break down hexadecimal number CDEFh in a similar fashion:

 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

We have just converted the number CDEFh to decimal (i.e. switched base 16 to base 10).


In binary system, the radix is 2, so only digits 0 and 1 are used. Here is the conversion of binary number 1010b to decimal:

 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

Octal system - same thing, radix is 8, digits 0...7 are in use. Converting octal 04567 to decimal:

 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

So, to do a conversion between number systems is to simply change the radix.

To learn about bitwise operators, see http://www.eskimo.com/~scs/cclass/int/sx4ab.html.

1: http://en.wikipedia.org/wiki/RadixIn our everyday decimal system, the base number, or radix is 10. A number system's radix tells us how many different digits are in use. In decimal system we use digits 0 through 9.

The significance of a digit is radix ^ i, where i is digit's position counting from right, starting at zero.

Decimal number 6789 broken down:

 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

This scheme will help us understand any number system in terms of decimal numbers.


Hexadecimal system's radix is 16, so we need to employ additional digits A...F to denote 10...15. Let's break down hexadecimal number CDEFh in a similar fashion:

 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

We have just converted the number CDEFh to decimal (i.e. switched base 16 to base 10).


In binary system, the radix is 2, so only digits 0 and 1 are used. Here is the conversion of binary number 1010b to decimal:

 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

Octal system - same thing, radix is 8, digits 0...7 are in use. Converting octal 04567 to decimal:

 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

So, to do a conversion between number systems is to simply change the radix.

To learn about bitwise operators, see http://www.eskimo.com/~scs/cclass/int/sx4ab.html.


Use Google:

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

The fundamental concept of number systems is this: a number is the sum of each of its digits times its base raised to the power of the position of the number.

Hex, decimal, octal, and binary are all "bases" of number systems, but they count the same thing. You know decimal already, so it is the easiest to explain:

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

This exact principle applies to every base system.

Binary:

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

Hexadecimal (hex):

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

Hex is really the only common base that isn't intuitively obvious, because it uses alpha characters to describe the values 10,11,12,13,14, and 15, using the letters a,b,c,d,e, and f respectively, instead.

We use binary, octal, and hex because binary is the language of computers (remember, a digital wire can either have current or not have current (values 1 or 0)). Each single hex character describes four binary digits exactly, while an octal character describes 3 binary digits. Hex is used much more often than octal.

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

Capitalization of hexadecimal numbers isn't important. The most important thing for you to memorize in terms of number systems is the above table. You should usually use Google when converting long hexadecimal or binary numbers to decimal, but if you know the table above then you won't need Google for many short strings.

As an exercise, I also recommend that you write conversion methods in the language of your choice to convert from one base system to another. They are simple iterators and will help solidify the concepts in your head. I love writing them like this: decimal_ot_binary(binarynum) instead of binary_to_decimal(binarynum). Then you can nest them sensically: int x = decimal_ot_hex(hex_ot_binary(binary_ot_decimal(40001)));

Now, any time you see a hex number in the form 0x????? you'll know that it is simply a representation for a string of binary digits. Just convert each character in the hex to the corresponding binary digit, as above.


Learning to convert number bases (also known as radixes) is much easier with a radix conversion tool that does all the hard work for you.

That way you can learn quickly by converting a bunch of numbers to and from different radixes, and see right away the result of the conversion.

Use this radix converter -- http://www.sooeet.com/math/base-converter.php

to convert a list of decimal numbers to binary, octal, and hexadecimal (one number at a time).

Here are two lists of decimal numbers to get you started:

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

The two lists look similar, but produce very different results when you convert them to binary, octal, and hexadecimal. Try it and see.

To use this number base converter, type a number, or copy and paste any number from the above lists, into the "Base-10" box, and press Enter or Return on your keyboard. The number you entered is converted to binary (base-2), octal (base-8), and hexadecimal (base-16), plus many other number bases (radixes), from base-2 and base-36.

If you want to better understand radix conversion, read the help pop-ups next to each radix box, to learn about the internal workings of each radix.

Now, try changing the binary, octal, and hex numbers that you got from converting the above lists, by replacing binary, octal, or hex "digits".

For example: Decimal 15 = binary 1111

Now, in the binary result (1111), replace any of the 1 binary digits (bits), with a zero (0) and press Enter or Return on your keyboard.

In this example: Binary 1101 = decimal 13

You can see that the second bit from the right in a binary number has a weight of 2 decimal.

Keep experimenting like this, with decimal, binary, octal, and hexadecimal number conversions, and you will soon master the subject.


Here my code in Python for Numeral conversions(2,8,10,16) from any to any. it may help you.

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()


Converting between binary, octal, and hex is pretty easy.

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)

These are easy because the radixes for binary, octal, and hex are all powers of 2. The trick is going between decimal and the other three, because 10 (the radix for decimal) has that pesky factor of 5.

Several other answers show how to convert from binary, octal, and hex to decimal. The algorithm I was taught to go from decimal to another radix is to continually divide by the radix and read off the remainders as the answer going right to left. For instance, here's how to express 227 in hex:

 n   n / 16  remainder
───  ──────  ─────────
227    14     3
 14     0    14 (=E)

so the answer is E3.


Decimal, hexadecimal, octal, binary and multi-radix converter

Maybe playing with this inline snippet could help...

This little javascript snippet could convert in all ways:

You can type any valid entry in one of the input field, they will be instantly converted into each other fields.

Enter for sample 10 or 100, successively in each fields below (or try to enter 1767707668033969 in integer field ;) ...

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>

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜