ПОМОГИТЕ!Я не знаю двоичный, шестнадцатеричный, восьмеричный и побитовый - PullRequest
4 голосов
/ 03 февраля 2011

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

Ответы [ 7 ]

16 голосов
/ 03 февраля 2011

В нашей повседневной десятичной системе базовое число или radix равно 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

Octal система - то же самое, основание - 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.

2 голосов
/ 03 февраля 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

Шестнадцатеричная (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 - действительно единственная общая база, которая не является интуитивно понятной, поскольку она использует буквенные символы для описания значений 10,11,12,13,14 и 15, используявместо этого буквы a, b, c, d, e и f соответственно.

Мы используем двоичные, восьмеричные и шестнадцатеричные, потому что двоичный - это язык компьютеров (помните, что цифровой провод может иметь ток или нетиметь ток (значения 1 или 0)).Каждый шестнадцатеричный символ точно описывает четыре двоичные цифры, а восьмеричный символ - 3 двоичные цифры.Шестнадцатеричный код используется гораздо чаще восьмеричного.

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

2 голосов
/ 03 февраля 2011

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

1 голос
/ 07 апреля 2015

Вот мой код в 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()
1 голос
/ 15 мая 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» и нажмите клавишу «Ввод» или «Return» на клавиатуре.,Введенное вами число преобразуется в двоичное (основание-2), восьмеричное (основание-8) и шестнадцатеричное (основание-16), а также многие другие числовые основания (радиусы) из базовых-2 и базовых-36.

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

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

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

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

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

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

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

1 голос
/ 03 февраля 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 *. 1004 *

Несколько других ответов показывают, как преобразовать двоичные, восьмеричные и шестнадцатеричные числа в десятичные.Алгоритм, которому меня учили переходить от десятичного числа к другому, состоит в том, чтобы непрерывно делить на основание и считывать остатки как ответ, идущий справа налево.Например, вот как выразить 227 в шестнадцатеричном виде:

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

, поэтому ответ E3.

0 голосов
/ 07 апреля 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>
...