ПОМОЩЬ! Я не знаю двоичного, шестнадцатеричного, восьмеричного и побитового

Раньше я не изучал это на уроках программирования, но теперь мне нужно это знать. Какие есть хорошие ресурсы для изучения этих чисел и как их преобразовать? Я в значительной степени собираюсь запомнить их, как таблицу умножения.


person Strawberry    schedule 03.02.2011    source источник
comment
Я бы не рекомендовал пытаться запоминать их. Однозначные числа в основном тривиальны (восьмеричное 7 = десятичное 7, о боже!), и, несмотря ни на что, вы поймете что-то важное при частом использовании гораздо лучше, чем при механическом запоминании.   -  person Anon.    schedule 03.02.2011


Ответы (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 в десятичное (т.е. поменяли основание 16 на основание 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

Итак, чтобы выполнить преобразование между системами счисления, нужно просто изменить основание счисления.

Чтобы узнать о побитовых операторах, см. http://www.eskimo.com/~scs/cclass/int/sx4ab.html.

person makes    schedule 03.02.2011
comment
Я не уверен, что полностью понимаю это. Итак, я пытаюсь преобразовать A100h в восьмеричное. Используя то, что вы мне показали, я получил 5184. Используя калькулятор Windows, я получил 120400. Что я делаю неправильно? Я пытаюсь научиться конвертировать между любой комбинацией шестнадцатеричного, двоичного, декабрьского и окт. - person Strawberry; 07.02.2011
comment
Преобразование шестнадцатеричного числа в восьмеричное намного проще, чем преобразование шестнадцатеричного в десятичное или наоборот. Просто используйте таблицу поиска из моего ответа ниже, чтобы преобразовать шестнадцатеричный код в двоичный, а затем преобразовать двоичный код в восьмеричный, используя ту же таблицу поиска: 0xA100 -> 0b1010000100000000 (каждая четверка в двоичном формате — это одна шестнадцатеричная цифра). Каждая тройка в двоичном коде — это одна восьмеричная цифра, поэтому 0b1 010 000 100 000 000 -> 0o120400 - person Thomson Comer; 07.02.2011

Это: http://members.tripod.com/numeric_systems/ кажется хорошим началом.
Кстати, информация об этом есть везде, надо только поискать.

person Gerardo Marset    schedule 03.02.2011

Используйте 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

Фундаментальная концепция систем счисления такова: число есть сумма каждой из его цифр, умноженная на его основание, возведенное в степень разряда числа.

Шестнадцатеричная, десятичная, восьмеричная и двоичная — все это «основы» систем счисления, но они считают одно и то же. Вы уже знаете десятичную дробь, поэтому проще всего объяснить:

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?????, вы будете знать, что это просто представление строки двоичных цифр. Просто преобразуйте каждый символ в шестнадцатеричном формате в соответствующую двоичную цифру, как указано выше.

person Thomson Comer    schedule 03.02.2011
comment
Десятичная система может идеально представлять любое двоичное число, даже если количество двоичных цифр в десятичной цифре непостоянно. - person makes; 03.02.2011
comment
Десятичная система имеет другой набор иррациональных чисел, чем системы счисления с основанием два, поэтому не может идеально представлять. - person Thomson Comer; 03.02.2011
comment
Все системы счисления с натуральной системой счисления используют один и тот же набор иррациональных чисел (то есть чисел, которые не могут быть выражены как дробь двух целых чисел). - person makes; 04.02.2011
comment
Любое число, имеющее завершающее двоичное представление, также имеет завершающее десятичное представление. Однако обратное неверно — например, 0.4 становится 0.011001100... в двоичном формате. Если число может быть записано как p/((2^a)*(5^b)), оно имеет завершающее десятичное представление. Если b=0, т. е. его также можно записать как p/(2^a), он имеет завершающее двоичное представление. - person makes; 04.02.2011
comment
Ах, круто. По какой-то причине я предположил, что некоторые неконечные дроби в десятичном формате заканчиваются в двоичном, и наоборот (как вы продемонстрировали). Теперь я вижу, что, поскольку простые множители десятичной дроби равны 2 и 5, в десятичной дроби нет некончающихся дробей, которые оканчиваются в двоичной системе, поскольку двоичная простая дробь равна 2. Спасибо! - person Thomson Comer; 04.02.2011

Преобразование между двоичным, восьмеричным и шестнадцатеричным довольно просто.

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)

так что ответ Е3.

person Ted Hopp    schedule 03.02.2011

Научиться преобразовывать системы счисления (также известные как системы счисления) намного проще с помощью инструмента преобразования системы счисления, который сделает всю тяжелую работу за вас.

Таким образом, вы можете быстро учиться, преобразовывая кучу чисел в разные системы счисления и из них, и сразу же видеть результат преобразования.

Используйте этот преобразователь счисления -- 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

Два списка выглядят одинаково, но дают очень разные результаты при преобразовании их в двоичный, восьмеричный и шестнадцатеричный форматы. Попробуйте и посмотрите.

Чтобы использовать этот преобразователь числа, введите число или скопируйте и вставьте любое число из приведенных выше списков в поле «Основание-10» и нажмите Enter или Return на клавиатуре. Введенное вами число преобразуется в двоичное (по основанию 2), восьмеричное (по основанию 8) и шестнадцатеричное (по основанию 16), а также во многие другие системы счисления (системы счисления) от 2 до 36.

Если вы хотите лучше понять преобразование системы счисления, прочитайте всплывающие окна справки рядом с каждым полем системы счисления, чтобы узнать о внутренней работе каждой системы счисления.

Теперь попробуйте изменить двоичные, восьмеричные и шестнадцатеричные числа, полученные в результате преобразования приведенных выше списков, заменив двоичные, восьмеричные или шестнадцатеричные «цифры».

Например: десятичное число 15 = двоичное число 1111.

Теперь в двоичном результате (1111) замените любую из 1 двоичных цифр (битов) на ноль (0) и нажмите Enter или Return на клавиатуре.

В этом примере: Двоичный 1101 = десятичный 13

Вы можете видеть, что второй бит справа в двоичном числе имеет вес 2 после запятой.

Продолжайте экспериментировать с преобразованием десятичных, двоичных, восьмеричных и шестнадцатеричных чисел, и вскоре вы овладеете предметом.

person Ernest Barkowski    schedule 15.05.2011

Вот мой код в 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()
person Dass    schedule 07.04.2015

Десятичный, шестнадцатеричный, восьмеричный, двоичный и мультисистемный преобразователь

Возможно, игра с этим встроенным фрагментом может помочь...

Этот небольшой фрагмент 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>

person F. Hauri    schedule 07.04.2015