Раньше я не изучал это на уроках программирования, но теперь мне нужно это знать. Какие есть хорошие ресурсы для изучения этих чисел и как их преобразовать? Я в значительной степени собираюсь запомнить их, как таблицу умножения.
ПОМОЩЬ! Я не знаю двоичного, шестнадцатеричного, восьмеричного и побитового
Ответы (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.
Это: http://members.tripod.com/numeric_systems/ кажется хорошим началом.
Кстати, информация об этом есть везде, надо только поискать.
Используйте 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?????
, вы будете знать, что это просто представление строки двоичных цифр. Просто преобразуйте каждый символ в шестнадцатеричном формате в соответствующую двоичную цифру, как указано выше.
0.4
становится 0.011001100...
в двоичном формате. Если число может быть записано как p/((2^a)*(5^b))
, оно имеет завершающее десятичное представление. Если b=0
, т. е. его также можно записать как p/(2^a)
, он имеет завершающее двоичное представление.
- person makes; 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.
Научиться преобразовывать системы счисления (также известные как системы счисления) намного проще с помощью инструмента преобразования системы счисления, который сделает всю тяжелую работу за вас.
Таким образом, вы можете быстро учиться, преобразовывая кучу чисел в разные системы счисления и из них, и сразу же видеть результат преобразования.
Используйте этот преобразователь счисления -- 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 после запятой.
Продолжайте экспериментировать с преобразованием десятичных, двоичных, восьмеричных и шестнадцатеричных чисел, и вскоре вы овладеете предметом.
Вот мой код в 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>