Шестнадцатиричные числа c: c++ — Шестнадцатеричные числа в Си
(исключающее ИЛИ), << (сдвиг влево), >> (сдвиг вправо), ~ (поразрядное дополнение до единицы). Рассмотрим на примерах, как они работают, но перед этим уделим внимание выводу в языке C чисел в отличных от десятичной системах счисления.
В С можно присваивать целочисленные значения в десятичной, восьмеричной и шестнадцатеричной системах счисления. Для того, чтобы присвоить переменной число в восьмеричной системе счисления, перед ним надо написать 0 (ноль), в шестнадцатеричной — 0x (ноль и икс), например:
int a, b; a = 077; // восьмеричное число b = 0x1F; // шестнадцатеричное число
Любые целые числа можно выводить на экран в десятичном, восьмеричном и шестнадцатеричном представлении. Пример кода для вывода определенных ранее двух переменных в различных системаъ счисления:
printf("%d %o %x %X\n", a,a,a,a); printf("%d %o %x %X\n", b,b,b,b);
В результате на экране вы увидите:
63 77 3f 3F 31 37 1f 1F
Восьмеричные и шестнадцатеричные числа используются из-за удобства при работе с двоичной системой счисления. Каждая цифра восьмеричного числа может быть заменена тремя цифрами двоичного. И каждая цифра шестнадцатеричного числа легко заменяет четыре разряда двоичного числа. Вот таблица соответствия цифр восьмеричной системы счисления числам двоичной системы:
0 | 000 |
1 | 001 |
2 | 010 |
3 | 011 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
Теперь допустим, что у нас есть восьмеричное число 037. По таблице легко понять, что в двоичном выражении оно будет выглядеть как 011 111.
- Как будут выглядеть восьмеричные числа 04271 и 03566 в двоичном представлении.
- Составьте на бумаге таблицу соответствия шестнадцатеричный цифр двоичным числам. Переведите числа 7D, FFFF, 2C9 в двоичную систему счисления. 036 = 021
017 > 2 = 03
~017 = 037777777760Этот результат будет проще понять с помощью рисунка:
В последнем случае получилось такое большое число потому, что под форматы вывода целых чисел (
%d, %o, %X
) выделяется по 4 байта.- Используя шестнадцатеричные числа, напишите аналогичную приведенной выше программу. Объясните результат.
- Попробуйте составлять сложные битовые операции (в несколько действий) и оценивать их результат.
Теперь рассмотрим пример использования битовых операций. Допустим, у нас есть массив, требуется снять с него «маску», которая бы отражала, в какой позиции стоят отрицательные, а в какой положительные элементы. Пусть единица в бите обозначает соответствующий ей положительный элемент массива, а ноль — отрицательный. Другими словами, если у нас есть массив {4, -3, 2, 2, 8, -1}, то его «битовая маска» будет выглядеть как 101110, или в восьмеричном представлении как 056. Составим алгоритм решения этой задачи:
- Будем считать, что массив состоит не более чем из 32 элементов. Поэтому для хранения его «маски» достаточно переменной типа
int
. Назовем ее mask и присвоим значение 0. - Перебрать элементы массива в цикле
for
. Если встречается положительный элемент, то установить соответствующий ему бит значения mask в 1. - Вывести значение переменной mask на экран в виде восьмеричного числа.
Вроде бы все просто, но как установить в единицу определенный бит числа? Существует закономерность соответствия степеней двойки и двоичного представления числа:
20 = 0000 0001
21 = 0000 0010
22 = 0000 0100
23 = 0000 1000
24 = 0001 0000
и т.д. Теперь если применить к mask побитовую операцию | (ИЛИ), а в качестве второго операнда использовать определенную степень двойки, то один бит будет установлен в 1. Например:
(0) 0000 0000 | (25) 0010 0000 = 0010 0000
(32) 0010 0000 | (27) 1000 0000 = 1010 0000При переборе первый элемент массива имеет индекс 0, но соответствующий ему бит в maskдолжен стоять впереди остальных. Если известно общее количество элементов массива (N), то можно определить степень двойки по формуле
N - i - 1
. Действительно, имея третий положительный элемент массива из 10 элементов, следует установить в единицу восьмой с конца бит, а это значит надо использовать вторым операндом битового ИЛИ 27, а 7 как раз будет 10(N) — 2(i) — 1.Другая проблема — как в языке C возвести число в степень. Понятно, что можно написать свой код, но скорее всего в стандартной библиотеке уже есть подобная функция. С помощью заголовочного файла math.h можно подключить библиотеку с математическими функциями. Среди них есть функция
pow()
, которая принимает два числа и возвращает результат возведения первого числа в степень, выраженную вторым числом. Однако результат возвращается в виде вещественного числа, а нам требуется целое. Как быть? В языке программирования С есть операции приведения типов, которые меняют тип значения с одного на другой. Например, чтобы преобразовать значение вещественной переменной a в целое, следует написать(int) a
.
Вот как может выглядеть вышеописанная программа:#include <stdio.h> #include <math.h> #define N 12 int main() { int nums[N] = {7, 3, 9, -5, -3, 2, 1, 0, 16, -4, 2, 0}; int mask = 0, i; for (i=0; i < N; i++) if (nums[i] >= 0) mask = mask|(int)pow(2,N-i-1); printf("%o\n", mask); }
Напишите предыдущую программу. Оцените как она работает1. Подумайте над тем, как вывести на экран двоичное представление восьмеричного числа. Попробуйте реализовать это.
1 Если у вас не получается скомпилировать программу, добавьте в конце вызова gcc опцию
-lm
(например,gcc -o bits bits.c -lm
).Курс с решением части задач:
android-приложение, pdf-версияСодержание
python — Двоичное представление числа с плавающей точкой в Python (биты не шестнадцатеричные)
Как получить строку в виде двоичного IEEE 754 представления 32-разрядного числа с плавающей запятой?
Пример
1.00 -> ‘00111111100000000000000000000000’
54
TheMeaningfulEngineer
8 Май 2013 в 19:37
12 ответов
Лучший ответ
Вы можете сделать это с помощью пакета
struct
:import struct def binary(num): return ''.join(bin(ord(c)).replace('0b', '').rjust(8, '0') for c in struct.pack('!f', num))
Это упаковывает его как сетевой упорядоченный байт, а затем преобразует каждый из результирующих байтов в 8-битное двоичное представление и объединяет их:
>>> binary(1) '00111111100000000000000000000000'
Edit : Была просьба расширить объяснение. Я расширю это, используя промежуточные переменные, чтобы комментировать каждый шаг.
def binary(num): # Struct can provide us with the float packed into bytes. The '!' ensures that # it's in network byte order (big-endian) and the 'f' says that it should be # packed as a float. Alternatively, for double-precision, you could use 'd'. packed = struct.pack('!f', num) print 'Packed: %s' % repr(packed) # For each character in the returned string, we'll turn it into its corresponding # integer code point # # [62, 163, 215, 10] = [ord(c) for c in '>\xa3\xd7\n'] integers = [ord(c) for c in packed] print 'Integers: %s' % integers # For each integer, we'll convert it to its binary representation. binaries = [bin(i) for i in integers] print 'Binaries: %s' % binaries # Now strip off the '0b' from each of these stripped_binaries = [s.replace('0b', '') for s in binaries] print 'Stripped: %s' % stripped_binaries # Pad each byte's binary representation's with 0's to make sure it has all 8 bits: # # ['00111110', '10100011', '11010111', '00001010'] padded = [s.rjust(8, '0') for s in stripped_binaries] print 'Padded: %s' % padded # At this point, we have each of the bytes for the network byte ordered float # in an array as binary strings. Now we just concatenate them to get the total # representation of the float: return ''.join(padded)
И результат для нескольких примеров:
>>> binary(1) Packed: '?\x80\x00\x00' Integers: [63, 128, 0, 0] Binaries: ['0b111111', '0b10000000', '0b0', '0b0'] Stripped: ['111111', '10000000', '0', '0'] Padded: ['00111111', '10000000', '00000000', '00000000'] '00111111100000000000000000000000' >>> binary(0.32) Packed: '>\xa3\xd7\n' Integers: [62, 163, 215, 10] Binaries: ['0b111110', '0b10100011', '0b11010111', '0b1010'] Stripped: ['111110', '10100011', '11010111', '1010'] Padded: ['00111110', '10100011', '11010111', '00001010'] '00111110101000111101011100001010'
62
Dan Lecocq
13 Ноя 2014 в 17:43Некоторые из этих ответов не работали так, как написано на Python 3, или не давали правильного представления для отрицательных чисел с плавающей запятой. Я нашел следующее, чтобы работать для меня (хотя это дает 64-битное представление, которое мне нужно)
def float_to_binary_string(f): def int_to_8bit_binary_string(n): stg=bin(n).replace('0b','') fillstg = '0'*(8-len(stg)) return fillstg+stg return ''.join( int_to_8bit_binary_string(int(b)) for b in struct.pack('>d',f) )
0
dkhammond
23 Сен 2016 в 19:01Конвертировать поплавок между 0..1
def float_bin(n, places = 3): if (n < 0 or n > 1): return "ERROR, n must be in 0..1" answer = "0." while n > 0: if len(answer) > places: return answer b = n * 2 if b > 1: answer += '1' n = b - 1 else: answer += '0' n = b return answer
0
tttzof351
29 Дек 2019 в 02:28С помощью этих двух простых функций ( Python> = 3.6 ) вы можете легко преобразовать число с плавающей запятой в двоичное и наоборот, для IEEE 754 binary64.
import struct def bin2float(b): ''' Convert binary string to a float. Attributes: :b: Binary string to transform. ''' h = int(b, 2).to_bytes(8, byteorder="big") return struct.unpack('>d', h)[0] def float2bin(f): ''' Convert float to 64-bit binary string. Attributes: :f: Float number to transform. ''' [d] = struct.unpack(">Q", struct.pack(">d", f)) return f'{d:064b}'
Например:
print(float2bin(1.618033988749894)) print(float2bin(3.14159265359)) print(float2bin(5.125)) print(float2bin(13.80)) print(bin2float('0011111111111001111000110111011110011011100101111111010010100100')) print(bin2float('0100000000001001001000011111101101010100010001000010111011101010')) print(bin2float('0100000000010100100000000000000000000000000000000000000000000000')) print(bin2float('0100000000101011100110011001100110011001100110011001100110011010'))
Результат:
0011111111111001111000110111011110011011100101111111010010100100 0100000000001001001000011111101101010100010001000010111011101010 0100000000010100100000000000000000000000000000000000000000000000 0100000000101011100110011001100110011001100110011001100110011010 1.618033988749894 3.14159265359 5.125 13.8
Надеюсь, вам понравится, у меня это отлично работает.
0
JavDomGom
9 Янв 2020 в 11:25Для полноты вы можете достичь этого с помощью numpy:
f = 1.00 int32bits = np.asarray(f, dtype=np.float32).view(np.int32).item() # item() optional
Затем вы можете напечатать это с отступом, используя спецификатор формата
b
print('{:032b}'.format(int32bits))
5
Eric
8 Июл 2017 в 21:05Эту проблему легче решить, разбив ее на две части.
Первый — преобразовать число с плавающей точкой в int с эквивалентным битовым шаблоном:
def float32_bit_pattern(value): return sum(ord(b) << 8*i for i,b in enumerate(struct.pack('f', value)))
Затем преобразуйте int в строку:
def int_to_binary(value, bits): return bin(value).replace('0b', '').rjust(bits, '0')
Теперь объедините их:
>>> int_to_binary(float32_bit_pattern(1.0), 32) '00111111100000000000000000000000'
8
Mark Ransom
8 Май 2013 в 16:28Нашли другое решение, используя модуль bitstring.
import bitstring f1 = bitstring.BitArray(float=1.0, length=32) print f1.bin
Выход:
00111111100000000000000000000000
21
maddin25
6 Сен 2018 в 14:37После просмотра множества похожих вопросов я написал что-то, что, надеюсь, делает то, что я хотел.
f = 1.00 negative = False if f < 0: f = f*-1 negative = True s = struct.pack('>f', f) p = struct.unpack('>l', s)[0] hex_data = hex(p) scale = 16 num_of_bits = 32 binrep = bin(int(hex_data, scale))[2:].zfill(num_of_bits) if negative: binrep = '1' + binrep[1:]
binrep
является результатом. Каждая часть будет объяснена.f = 1.00 negative = False if f < 0: f = f*-1 negative = True
Преобразует число в положительное, если отрицательное, и устанавливает отрицательную переменную в false. Причина этого заключается в том, что разница между положительным и отрицательным двоичными представлениями только в первом бите, и это был более простой способ, чем выяснить, что не так при выполнении всего процесса с отрицательными числами.
s = struct.pack('>f', f) #'?\x80\x00\x00' p = struct.unpack('>l', s)[0] #1065353216 hex_data = hex(p) #'0x3f800000'
s
является шестнадцатеричным представлением двоичного файлаf
. это однако не в симпатичной форме, в которой я нуждаюсь. Вот где входит p. Это представление int гекса s. А затем еще одно преобразование, чтобы получить красивый гекс.scale = 16 num_of_bits = 32 binrep = bin(int(hex_data, scale))[2:].zfill(num_of_bits) if negative: binrep = '1' + binrep[1:]
scale
является основанием 16 для гекса.num_of_bits
равен 32, поскольку число с плавающей запятой составляет 32 бита, позднее оно используется для заполнения дополнительных мест 0 для перехода к 32. Получил код дляbinrep
из этот вопрос. Если число было отрицательным, просто измените первый бит.Я знаю, что это уродливо, но я не нашел хорошего пути, и мне нужно было быстро. Комментарии приветствуются.
2
Community
23 Май 2017 в 11:55Вот уродливый …
>>> import struct >>> bin(struct.unpack('!i',struct.pack('!f',1.0))[0]) '0b111111100000000000000000000000'
По сути, я просто использовал модуль struct для преобразования float в int …
Вот немного лучше, используя
ctypes
:>>> import ctypes >>> bin(ctypes.c_uint.from_buffer(ctypes.c_float(1.0)).value) '0b111111100000000000000000000000'
По сути, я создаю
float
и использую ту же область памяти, но отмечаю ее какc_uint
. Значениеc_uint
является целым числом Python, для которого вы можете использовать встроенную функциюbin
.33
mgilson
26 Сен 2017 в 15:55Это немного больше, чем просили, но это было то, что мне было нужно, когда я нашел эту запись. Этот код даст мантиссу, основание и знак 32-разрядного числа с плавающей запятой IEEE 754.
import ctypes def binRep(num): binNum = bin(ctypes.c_uint.from_buffer(ctypes.c_float(num)).value)[2:] print("bits: " + binNum.rjust(32,"0")) mantissa = "1" + binNum[-23:] print("sig (bin): " + mantissa.rjust(24)) mantInt = int(mantissa,2)/2**23 print("sig (float): " + str(mantInt)) base = int(binNum[-31:-23],2)-127 print("base:" + str(base)) sign = 1-2*("1"==binNum[-32:-31].rjust(1,"0")) print("sign:" + str(sign)) print("recreate:" + str(sign*mantInt*(2**base))) binRep(-0.75)
Выход:
bits: 10111111010000000000000000000000 sig (bin): 110000000000000000000000 sig (float): 1.5 base:-1 sign:-1 recreate:-0.75
2
johnml1135
11 Ноя 2016 в 13:04Вы можете использовать .format для простейшего представления битов на мой взгляд:
Мой код будет выглядеть примерно так:
def fto32b(flt): # is given a 32 bit float value and converts it to a binary string if isinstance(flt,float): # THE FOLLOWING IS AN EXPANDED REPRESENTATION OF THE ONE LINE RETURN # packed = struct.pack('!f',flt) <- get the hex representation in (!)Big Endian format of a (f) Float # integers = [] # for c in packed: # integers.append(ord(c)) <- change each entry into an int # binaries = [] # for i in integers: # binaries.append("{0:08b}".format(i)) <- get the 8bit binary representation of each int (00100101) # binarystring = ''.join(binaries) <- join all the bytes together # return binarystring return ''.join(["{0:08b}".format(i) for i in [ord(c) for c in struct.pack('!f',flt)]]) return None
Выход:
>>> a = 5.0 '01000000101000000000000000000000' >>> b = 1.0 '00111111100000000000000000000000'
-1
Robert Hughes
1 Мар 2016 в 02:44Свинья с ответом Дэна с цветной версией для Python3:
import struct BLUE = "\033[1;34m" CYAN = "\033[1;36m" GREEN = "\033[0;32m" RESET = "\033[0;0m" def binary(num): return [bin(c).replace('0b', '').rjust(8, '0') for c in struct.pack('!f', num)] def binary_str(num): bits = ''.join(binary(num)) return ''.join([BLUE, bits[:1], GREEN, bits[1:10], CYAN, bits[10:], RESET]) def binary_str_fp16(num): bits = ''.join(binary(num)) return ''.join([BLUE, bits[:1], GREEN, bits[1:10][-5:], CYAN, bits[10:][:11], RESET]) x = 0.7 print(x, "as fp32:", binary_str(0.7), "as fp16 is sort of:", binary_str_fp16(0.7))
0
y.selivonchyk
24 Фев 2020 в 21:29Шестнадцатиричные числа — это… Что такое Шестнадцатиричные числа?
- Шестнадцатиричные числа
Шестнадцатеричная система счисления (шестнадцатеричные числа) — позиционная система счисления по целочисленному основанию 16. Обычно в качестве шестнадцатеричных цифр используются десятичные цифры от 0 до 9 и латинские буквы от A до F для обозначения цифр от 10 до 15.
Применение
Широко используется в низкоуровневом программировании и вообще в компьютерной документации, поскольку в современных компьютерах минимальной единицей памяти является 8-битный байт, значения которого удобно записывать двумя шестнадцатеричными цифрами. Такое использование началось с системы IBM/360, где вся документация использовала шестнадцатеричную систему, в то время как в документации других компьютерных систем того времени (даже с 8-битными символами, как, например, БЭСМ-6) использовали восьмеричную систему.
В стандарте Юникода номер символа принято записывать в шестнадцатеричном виде, используя не менее 4 цифр (при необходимости — с ведущими нулями).
Способы записи
В математике
В математике систему счисления принято писать в подстрочном знаке. Например, десятичное число 1443 можно записать как 144310 или как 5A316.
В языках программирования
В разных языках программирования для записи шестнадцатеричных чисел используют различный синтаксис:
- В Ада и
- В Си и языках схожего синтаксиса, например, в
- В некоторых ассемблерах используют букву «h», которую ставят после числа. Например, «5A3h». При этом, если число начинается не с десятичной цифры, впереди ставится «0» (ноль): «0FFh» (25510)
- Другие ассемблеры (AT&T, Motorola), а также Паскаль и некоторые версии Бэйсика используют префикс «$». Например, «$5A3».
- Некоторые иные платформы, например ZX Spectrum в своих ассемблерах (MASM, TASM, ALASM, GENS и т.д.) использовали запись #5A3, обычно выровненную до одного или двух байт: #05A3.
- Другие версии Бэйсика используют для указания шестнадцатеричных цифр сочетание «&h». Например, «&h5A3».
- В Unix-подобных операционных системах (и многих языках программирования, имеющих корни в Unix/linux) непечатные символы при выводе/вводе кодируются как \xCC, где CC — шестнадцатеричный код символа.
- Шестнадцать
- Шестнадцатиричная система исчисления
ЦИФРА — условный знак для обозначения числа. В узком смысле слова, цифрой называются знаки от 0 до 9. Различают цифры арабские, римские, двоичные, троичные, десятичные, шестнадцатиричные, значащие, нулевые и т.д. (См. (), система цифровая.) … Большая политехническая энциклопедия
bool (логический тип)
int (целые числа)
float (дробные числа)
string (строки)
array (массивы)
object (объекты)
callable (функции)
mixed (любой тип)
resource (ресурсы)
null (отсутствие значения)
шестнадцатеричные : 0[xX][0-9a-fA-F]
восьмеричные : 0[0-7]
двоичные : 0b[01]
- int.bit_length()¶
- возвращает количество бит, которое необходимо для представления числа в памяти, без учета знака и незначащих нулей:
- int.to_bytes(length, byteorder, *, signed=False)¶
- возвращает массив байтов, который соответствует данному числу:
- classmethod int.from_bytes(bytes, byteorder, *, signed=False)¶
- возвращает целое число, которое соответствует указанному массиву байтов.
- В десятичной системе счисления всего десять цифр (чисел, записываемых одним символом) — от 0 до 9.
- Число десять — первое число, которое нельзя записать одной цифрой.
- Число десять является основанием десятичной системы счисления.
- В шестнадцатеричной системе счисления 16 цифр (чисел, которые можно записать одним символом). Это цифры от 0 до 9 и первые шесть символов латинского алфавита — A, B, C, D, E, F. Можно при записи использовать и прописные буквы a, b, c, d, e, f. Все эти цифры соответствуют десятичным числам от нуля до 15.
- Число, которое соответствует десятичному 16 — первое, которое нельзя записать одной цифрой. Проиллюстрируем это рядами чисел:
- Шестнадцать — основание в своей системе счисления. То есть, расписывая в ней числа, нужно в степень возводить число 16, а не десятку, как мы привыкли. Это, кстати говоря, позволит нам узнать, чему равно то или иное шестнадцатеричное число.
- Проверяем, не меньше ли 16 наше число: если да, то результат достигнут. Действительно, такое десятичное число необходимо лишь заменить соответствующей ему шестнадцатеричной цифрой из таблицы 1. Если же наше десятичное число больше 16, переходим к шагу 2.
- Делим наше число НАЦЕЛО на 16 и запоминаем целочисленный остаток от этого деления. Результат этого деления снова сравниваем с 16. Если результат деления меньше 16, то его стоит тоже запомнить как последний из остатков.
- Шаг 2 повторяем до тех пор, пока результат деления не будет меньше 16. Целочисленные остатки на всех этапах запоминаем. Они понадобятся в шаге 4.
- Все остатки записываем в обратном порядке и заменяем в них числа от 10 до 15 шестнадцатеричными цифрами от a до f.
- сложение +
- вычитание −
- умножение ×
- деление ÷
- логическое И (AND)
- логическое ИЛИ (OR)
- исключающее ИЛИ (XOR)
/ *
* Программа C для преобразования десятичного числа в шестнадцатеричное
* /
#include
int main ()
{
длинное десятичное число, частное, остаток;
int i, j = 0;
шестнадцатеричный символ [100];
printf («Введите десятичное число:»);
scanf ("% ld", & decimalnum);
частное = десятичное число;
в то время как (частное! = 0)
{
остаток = частное% 16;
если (остаток <10)
шестнадцатеричное число [j ++] = 48 + остаток;
иначе
шестнадцатеричное число [j ++] = 55 + остаток;
частное = частное / 16;
}
// отображение целого числа в символ
for (i = j; i> = 0; i--)
printf ("% c", шестнадцатеричное [я]);
возврат 0;
}
- Компьютер - в чем главная идея? *
- Принцип памяти - Компьютерная память и голубятни *
- Принципы исполнения - ЦП
- Суть программирования
- Переменные - объем, срок службы и многое другое *
- Двоичная арифметика
- Шестнадцатеричный *
- Двоичный - отрицательные числа
- Числа с плавающей запятой
- Внутри компьютера - адресация
- Функция Mod
- Рекурсия
- Утерянное искусство функции карты памяти *
- Хеширование - величайшая идея в программировании
- Расширенное хеширование
- XOR - Волшебный своп
- Введение программиста в XML
- От данных к объектам *
- Что такое функция первого класса - и почему вам это должно быть небезразлично *
- Стеки и деревья
- Стек LIFO - краткое руководство *
- Структуры данных - деревья
- Внутренние случайные числа
- Метод Монте-Карло
- Кэш-память и принцип кеширования
- Сжатие данных The Dictionary Way
- Сложные даты *
- Последовательное хранение *
- Магия слияния *
- Мощность операторов
- Сердце компилятора *
- Основы указателей
- Функциональное и дисфункциональное программирование *
8 16 равно [(8 × 16 0 )] 10
A8 16 [(10 × 16 ) + (8 × 16 0 )] 10
2A8 16 равно [(2 × 16 2 ) + (10 × 16 1 ) + (8 × 16 0 )] 10
218.F 16 - это [(2 × 16 2 ) + (1 × 16 1 ) + (8 × 16 0 ) + (15 × 16 –1 )] 10
218.F7 16 равно [(2 × 16 2 ) + (1 × 16 1 ) + (8 × 16 0 ) + (15 × 16 –1 ) + (7 × 16 –2 )] 10 .
8 16 равно 1000 2
A8 16 равно 10101000 2
000 2
000
6
6 00 2
218.F 16 - 001000011000.1111 2
218.F7 16 - 001000011000.11110111 2 .
- 3
- 2
000000000000000100000000.0000000000000000 2 8 256 - 2 минуты на чтение
Перевод чисел из одной системы счисления в другую
Перевод чисел из шестнадцатеричной системы в десятичную
Для перевода шестнадцатеричного числа в десятичное необходимо это число представить в виде суммы произведений степеней основания шестнадцатеричной системы счисления на соответствующие цифры в разрядах шестнадцатеричного числа.
Например, требуется перевести шестнадцатеричное число 5A3 в десятичное. В этом числе 3 цифры. В соответствии с вышеуказанным правилом представим его в виде суммы степеней с основанием 16:
5A316=5·162+10·161+3·160
=5·256+10·16+3·1=1280+160+3=144310
Перевод чисел из двоичной системы в шестнадцатеричную
Для перевода многозначного двоичного числа в шестнадцатеричную систему нужно разбить его на тетрады справа налево и заменить каждую тетраду соответствующей шестнадцатеричной цифрой.
Например:
101101000112=0101 1010 0011=5A316
Таблица перевода чисел
0hex | = | 0dec | = | 0oct | 0 | 0 | 0 | 0 | |||
1hex | = | 1dec | = | 1oct | 0 | 0 | 0 | 1 | |||
2hex | = | 2dec | = | 2oct | 0 | 0 | 1 | 0 | |||
3hex | = | 3dec | = | 3oct | 0 | 0 | 1 | 1 | |||
4hex | = | 4dec | = | 4oct | 0 | 1 | 0 | 0 | |||
5hex | = | 5dec | = | 5oct | 0 | 1 | 0 | 1 | |||
6hex | = | 6dec | = | 6oct | 0 | 1 | 1 | 0 | |||
7hex | = | 7dec | = | 7oct | 0 | 1 | 1 | 1 | |||
8hex | = | 8dec | = | 10oct | 1 | 0 | 0 | 0 | |||
9hex | = | 9dec | = | 11oct | 1 | 0 | 0 | 1 | |||
Ahex | = | 10dec | = | 12oct | 1 | 0 | 1 | 0 | |||
Bhex | = | 11dec | = | 13oct | 1 | 0 | 1 | 1 | |||
Chex | = | 12dec | = | 14oct | 1 | 1 | 0 | 0 | |||
Dhex | = | 13dec | = | 15oct | 1 | 1 | 0 | 1 | |||
Ehex | = | 14dec | = | 16oct | 1 | 1 | 1 | 0 | |||
Fhex | = | 15dec | = | 17oct | 1 | 1 | 1 | 1 | |||
См. также
Ссылки
Wikimedia Foundation.
2010.
Смотреть что такое «Шестнадцатиричные числа» в других словарях:
PHP | Типы данных
Типы данных
Последнее обновление: 28.02.2021
PHP является языком с динамической типизацией. Это значит, что тип данных переменной выводится во время выполнения,
и в отличии от ряда других языков программирования в PHP не надо указывать перед переменной тип данных.
В PHP есть десять базовых типов данных:
Из этих типов данных первые четыре являются скалярными: bool, int, float, string
. Поэтому вначале именно их и рассмотрим.
int (целочисленный тип)
Представляет целое число со знаком.
$num = -100; echo $num;
Здесь переменная $num
представляет целочисленный тип, так как ей присваивается целочисленное значение.
Кроме десятичных целых чисел PHP обладает возможностью использовать также двоичные, восьмеричные и шестнадцатеричные числа. Шаблоны чисел для других систем:
Например:
<?php // Все числа в десятичной системе имеют значение 28 $num_10 = 28; // десятичное число $num_2 = 0b11100; // двоичное число (28 в десятичной системе) $num_8 = 034; // восьмеричное число (28 в десятичной) $num_16 = 0x1C; // шестнадцатиричное число (28 в десятичной) echo "num_10 = $num_10 <br>"; echo "num_2 = $num_2 <br>"; echo "num_8 = $num_8 <br>"; echo "num_16 = $num_16"; ?>
Переменная типа int
занимает в памяти 32 бита, то есть может принимаь значения от -2 147 483 648 до 2 147 483 647.4
$a3 = 6E-8; // 0.00000006
?>
Тип bool (логический тип)
Переменные логического типа могут принимать два значения: true
и false
или иначе говоря истина
и ложь
.
Чаще всего логические значения используются в условных конструкциях:
<?php $foo = true; $boo = false; ?>
Тип string (строки)
Для работы с текстом можно применять строки. Строки бывают двух типов: в двойных кавычках и одинарных. От типа кавычек
зависит обработка строк интерпретатором. Так, переменные в двойных кавычках заменяются значениями, а переменные в одинарных кавычках остаются неизменными.
<?php $a=10; $b=5; $result = "$a+$b <br>"; echo $result; $result = '$a+$b'; echo $result; ?>
В этом случае мы получим следующий вывод:
10+5 $a+$b
Кроме обычных символов, строка может содержать специальные символы, которые могут быть неправильно интерпретированы. Например, нам надо добавить в строку кавычку:
$text = "Модель "Apple II"";
Данная запись будет ошибочна. Чтобы исправить ошибку, мы можем сочетать различные типы кавычек (‘Модель «Apple II»‘ или «Модель ‘Apple III'») или использовать слеш, чтобы ввести кавычку в строку:
$text = "Модель \"Apple II\"";
Специальное значение null
Значение null
указывает, переменная не имеет значения. Использование данного значения полезно в тех случаях, когда мы
хотим указать, что переменная не имеет значения. Например, если мы просто определим переменную без ее инициализации, и затем попробуем ее использовать,
то нам интерпретатор выдаст сообщение, что переменная не установлена:
<?php $a; echo $a; ?>
Использование значения null поможет избежать данной ситуации. Кроме того, мы сможем проверять наличие значения и в зависимости от результатов проверки
производить те или иные действия:
<?php $a = null; echo "a = $a"; ?>
Константа null не чувствительна к регистру, поэтому мы можем написать и так:
$a = NULL;
Динамическая типизация
Поскольку PHP — язык с динамической типизацией, то мы можем присваивать одной и той же переменной значения разных типов:
<?php $id = 123; echo "<p>id = $id</p>"; $id = "jhveruuyeru"; echo "<p>id = $id</p>"; ?>
int целые числа | Python
Системы счисления
Python поддерживает десятичные, двоичные, восьмеричные и шестнадцатеричные целые числа, причем не накладывается никаких ограничений на величину (длину) числа, лишь бы хватило памяти для его хранения.
SyntaxError: invalid token
Двоичные числа состоят из префикса 0b
(или 0B
) и двоичных цифр: \(0\) и \(1\):
>>> 0b0, 0b1, 0b10, 0b111, 0b10001010001110111011001
(0, 1, 2, 7, 4529625)
Восьмеричные числа начинаются с префикса 0o
(0O
) и могут содержать только восьмиричные цифры: \(0\), \(1\), \(2\), \(3\), \(4\), \(5\), \(6\) и \(7\):
>>> 0o0, 0o1, 0o10, 0o77, 0o12345670
(0, 1, 8, 63, 2739128)
Шестнадцатеричные числа начинаются с префикса 0x
(0X
) и могут содержать как все десятичные цифры, так и символы латинского алфавита: a, b, c, d, e, f
(или A, B, C, D, E, F
), которые в данном случае выступают в роли цифр:
>>> 0x0, 0x1, 0x10, 0xabcdf, 0x10f0a5d34a
(0, 1, 16, 703711, 72756876106)
В языках со строгой типизацией необходимо указывать как тип числа, так и то, что создаваемый объект сам является числом. Но в Python такой необходимости нет, интерпретатор сам, на основе анализа литералов целых чисел, способен понять что перед ним: число или нет, целое или вещественное, восьмеричное или двоичное.
Кстати, благодаря встроенной функции int()
мы можем перевести в десятичную систему счисления, любое число представленное в другой системе счисления с основанием меньшим \(37\). Интересующее число указывается в виде строки в первом аргументе, а система счисления в котором оно представлено в виде целого числа во втором аргументе:
>>> int('111', 2)
7
>>> int('111', 3)
13
>>> int('111', 8)
73
>>> int('111', 16)
273
>>> int('1az', 36)
1691
Арифметические операции
Целые числа поддерживают следующие математические операции, которые отсортированы по убыванию приоритета:
№ | Операция | Результат | Замечание |
---|---|---|---|
1 | x ** y | возводит x в степень y | (I) |
2 | pow(x, y[, z]) | возводит x в степень y по модулю z, где z – необязательный аргумент | (I) |
3 | divmod(x, y) | возвращает кортеж с парой чисел (x // y, x % y) | (II) |
4 | x.conjugate() | возвращает \(\bar{x}\) — число, которое комплексно сопряжено с \(x\) | |
5 | complex(re, im) | преобразует re в комплексное число (по умолчанию im = 0 ) | (VI) |
6 | float(x) | преобразует x в вещественное число (число с плавающей точкой) | (VI) |
7 | int(x) | переобразует x в целое число, представленное в десятичной системе счисления | (V)(VI) |
8 | abs(x) | абсолютное значение (модуль) числа x | |
9 | +x | делает число x положительным | |
10 | -x | делает число x отрицательным | |
11 | x % y | остаток от деления x на y | (II) |
12 | x // y | результат целочисленного деления x на y | (III) (II) |
13 | x / y | результат «истинного» деления x на y | (IV) |
14 | x * y | произведение x и y | |
15 | x - y | разность x и y | |
16 | x + y | сумма x и y |
Важно: приоритет математических операций выше побитовых логических операций и операций сравнения.
Замечания:
I. возведение \(0\) в степень \(0\) возвращает \(1\):
>>> 0**0, pow(0, 0)
(1, 1)
Извлечение корней четной степени из отрицательных чисел не вызывает ошибки, а возвращает комплексное число:
>>> (-1)**0.5
(6.123233995736766e-17+1j)
>>>
>>> pow(-25, 1/4)
(1.5811388300841898+1.5811388300841895j)
II. функция divmod()
и операция %
, //
не работают для комплексных чисел. Для вас это может быть и очевидно, но не пользователя для которого вы пишите программу.
III. если оба числа типа int то и результат будет типа int. Данная операция всегда возвращает целое число, т.е. если число x можно представить в виде d*y + r
, то x//y = d
(r – остаток от деления). Так же следует иметь ввиду, что результат данной операции всегда округляется в сторону минус бесконечности:
>>> 1//2, (-1)//2, 1//(-2), (-1)//(-2)
(0, -1, -1, 0)
Это немного сбивает с толку, но проверив результат по формуле x = d*y + r
, вы убедитесь что все верно.
IV. даже если оба числа типа int, то результат все равно будет преобразован к типу float.
V. встроенная функция int()
пропускает числа (объекты) типа int «как есть», не выполняя над ними, абсолютно никаких действий.
VI. строго говоря эти функции не являются математическими, но они могут учавствовать в математических выражениях Python и поэтому должны обладать приоритетом.
Логические побитовые операции
Фактически, если число можно перевести в двоичную систему счисления, значит его можно рассматривать как двоичные данные. Учитывая, что такие данные состоят из нулей и единиц, которые интерпретируются как логические значения True и False, мы можем выполнять над ними логические операции. Логические операции выполняются по отдельным битам соответствующих разрядов. Если в операции учавствуют числа с разным количеством разрядов, то недостающие разряды дополняются нулями слева.
Данные операции могут быть выполнены, только над целыми числами. Если в выражении или в результате операции имеются отрицательные числа, то они представляются в виде дополнительного кода. Например, мы знаем, что результатом логического оператора ~
(побитовое НЕ) примененного, скажем, к числу 0b111
должно быть число 0b000
, но вместо этого мы видим число дополнительный код которого соответствует данной операции:
>>> bin(7)
'0b111'
>>> ~7
-8
>>> bin(-8)
'-0b1000'
В таблице перечислены все побитовые операции в порядке убывания их приоритета:
№ | Операция | Результат | Замечание |
---|---|---|---|
1 | ~x | инвертирование битов x | (I) |
2 | x >> n | сдвиг битов числа x вправо на n разрядов | (II)(III) |
3 | x << n | сдвиг битов числа x влево на n разрядов | (II)(IV) |
4 | x & y | побитовое И чисел x и y | |
5 | x ^ y | побитовое исключающее ИЛИ чисел x и y | |
6 | x | y | побитовое ИЛИ чисел x и y |
Важно: приоритет побитовых операций ниже математически, но выше операций сравнения.
Замечания:
I. унарные операции ~
, +
и -
имеют одинаковый приоритет.
II. отрицательное значение в выражеиях x << n
и x >> n
приведет к ошибке и вызовет исключение ValueError.
III. операция x << n
эквивалентна команде x*pow(2, n)
, но проверка переполнения в этой команде не выполняется:
>>> 7 << 3, 7*pow(2, 3)
(56, 56)
IV. операция x >> n
эквивалентна команде x // pow(2, n)
, но проверка переполнения в этой команде не выполняется:
>>> 63 >> 3, 63//pow(2, 3)
(7, 7)
Операции сравнения
Для сравнения чисел, доступно \(8\) операций сравнения, причем все они имеют одинаковый приоритет:
№ | Операция | Результат | Замечание |
---|---|---|---|
1 | x < y | True если x меньше y, иначе False | |
2 | x <= y | True если x меньше или равно y, иначе False | |
3 | x > n | True если x больше y, иначе False | |
4 | x >= n | True если x больше или равно y, иначе False | |
5 | x == y | True если x равно y, иначе False | |
6 | x != y | True если x не равно y, иначе False | |
7 | x is y | True если x и y это один и тот же объект, иначе False | |
8 | x is not y | True если x и y это не один и тот же объект, иначе False |
Важно: приоритет операций сравнения ниже математических и побитовых операций.
Наряду с оператором сравнения значений чисел ==
и !=
, в Python имеются операторы is
и is not
, которые позволяют выяснить, являются сравниваемые значения одним и тем же объектом или нет. Например:
>>> a = 1001
>>> b = 1000 + 1
>>>
>>> a == b
True
>>>
>>> a is b, a is not b
(False, True)
Не смотря на то, что значения a и b равны, в памяти компьютера они хранятся как разные объекты:
>>> id(a), id(b)
(3071801680, 3071801728)
Однако, придумать для данного оператора сколь-нибудь полезное практическое применение, относительно математических операций я не могу.
В Python сравнение x > y and y > z
является эквивалентным x > y > z
т.е. сравнения связаные оператором and
в произвольные цепочки могут быть записаны в более компактной форме. Выполнение таких выражений начинается слева направо и останавливается как только будет получено первое значение False. Это означает, что если в выражении x > y > z
сравнение x > y
вернет False то сравнение y > z
выполняться не будет.
Методы целых чисел
Целые числа – это объекты, которые обладают следующими методами:
>>> x = 204
>>> bin(x)
'0b11001100'
>>>
>>> x.bit_length()
8
>>>
>>> (-0b000000000000001).bit_length()
1
Параметр length
задает необходимое количество байтов, а byteorder
определяет в каком порядке возвращать байты: значение 'big'
– от старшего к младшему, 'little'
– от младшего к старшему. Оба параметра являются обязательными:
>>> (129).to_bytes(2, byteorder = 'big')
b'\x00\x81'
>>>
>>> (129).to_bytes(5, 'big')
b'\x00\x00\x00\x00\x81'
>>>
>>> (129).to_bytes(5, 'little')
b'\x81\x00\x00\x00\x00
Если указанных байтов недостаточно для представления числа, то будет вызвано исключение OverflowError. А что бы узнать и (или) использовать порядок байтов который использует машина, выполняющая код используйте sys.byteorder
.
Параметр signed
позволяет установить использование дополнительного кода для отрицательных целых чисел:
>>> (127).to_bytes(2, 'big', signed = True)
b'\x00\x7f'
>>>
>>> (-127).to_bytes(2, 'big', signed = True)
b'\xff\x81'
Если signed = False
, а число является отрицательным, то будет вызвано исключение OverflowError.
Параметры bytes
и byteorder
являются обязательными. bytes
— должен быть байто-подобным объектом (строки байтов, массивы байтов, array.array и т.д.). Описание параметров byteorder
и signed
смотрите в int.to_bytes()
:
>>> int.from_bytes(b'\x00\x7f', byteorder = 'big')
127
>>>
>>> int.from_bytes(b'\x00\x7f', byteorder = 'little')
32512
>>>
>>> int.from_bytes(b'\xff\x81', 'big', signed = True)
-127
>>>
>>>
>>> int.from_bytes([1, 0], 'big') # можно указать "массив" байтов
256
>>> int.from_bytes([255, 255], 'big')
65535
Шестнадцатеричная арифметика
12.03.2009
106532
Пишу
38 комментариев
компьютерная теория
Дорогие друзья, спасибо всем, кто отписался в этой статье. Откровенно говоря, когда я её писал, то не задумывался о том, что она будет так популярна (самая популярная статья на этом сайте). Видимо в самом деле стоит дописать её, чтобы полнее осветить тему. Какие-то куски старой статьи останутся здесь без изменения, что-то я дополню, еще что-то — перепишу. Итак, приступим.
Как перевести шестнадцатеричное число в десятичное?
Всё не так страшно, как может показаться в самом начале, и начнем мы с привычной всем нам десятичной арифметики. Во втором классе средней школы нас учили, например, что число 136, это — 100 + 30 + 6.
Десятичная система счисления является позиционной, так как цифры в числах (разряды) обозначают разные величины в зависимости от того, в каком месте они находятся. Поясню примером: В числе 1375 цифра 3 обозначает три сотни, так как стоит в третьей позиции или разряде; а в числе 136 из предыдущего примера тройка — это лишь три десятка, так как стоит она во втором разряде. Цифра 3 в этих примерах обозначает разные числа, так как находится в разных разрядах. Полезно вспомнить три основных правила:
Поясню эти правила. С первым всё понятно. Второе: действительно, когда все числа из одной цифры исчерпаны, принято составлять числа из двух и более знаков (цифр): 10, 11, 12 и т. д. Чтобы проиллюстрировать третье правило, давайте вспомним о степенях — это сведения математики пятого класса средней школы. Чтобы возвести число А в степень х, необходимо число А умножить само на себя и множителей должно быть x штук. При этом А называется основанием степени, а х — показателем, записывается как Ах Вспомним ещё одно правило: любое число А в нулевой степени равно единице, то есть А0 = 1.
Теперь вернемся к нашему первому примеру — числу 136. Используя только что восстановленные в сознании правила, его можно записать так: 136 = 100 + 30 + 6 = 1×102 + 3×101 + 6×100.
Разряды чисел принято нумеровать справа налево и начинать при этом с нуля. Эти числа соответствуют показателям степеней, в которые надо возвести десятку в только что показанной записи. Приведем еще один пример — число 1375: 1375 = 1000 + 300 +70 + 5 = 1×103 + 3×102 + 7×101 + 5×100.
Понятно, что таким способом можно расписать любое целое десятичное число.
Настало время перейти к шестнадцатеричной системе счисления. Она тоже является позиционной, то есть цифры означают в ней разные числа в зависимости от разряда, в котором находятся. Шестнадцатеричная арифметика тоже подчиняется трём правилам, но они немного изменены для неё.
Таблица 1. Соответствие десятичных чисел шестнадцатеричным
Десятичные | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
Шестнадцатеричные | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f | 10 |
10-ная система | 16-ная система |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
8 | 8 |
9 | 9 |
10 | a |
11 | b |
12 | c |
13 | d |
14 | e |
15 | f |
16 | 10 |
Из этого примера видно, что числа в шестнадцатеричной арифметике формируются по тем же правилам — когда исчерпаны все числа, состоящие из одной цифры, мы используем уже две цифры для записи чисел и т. д.
Как, например, понять, чему равно шестнадцатеричное число FF? Распишем его по известному нам правилу. Вместо десятки подставим 16, а шестнадцатеричную цифру F заменим соответствующим ей десятичным числом 15. Итак: FF = F×161 + F×160 = 15×161 + 15×160 = 15×16 + 15 = 255.
Попробуем с другим числом, например, 1F5: 1F5 = 1×162 + F×161 + 5×160 = 162 + 15×16 + 5 = 501.
Подобная запись является правилом перевода шестнадцатеричных чисел в привычные нам десятичные. А можно ли десятичное число перевести в шестнадцатеричное? Конечно, да. Но, чтобы избежать путаницы, будем десятичные числа писать как прежде, а перед шестнадцатеричными числами будем ставить префикс «0x», что повсеместно принято для записи таких чисел в компьютере.
Как перевести десятичное число в шестнадцатеричное?
Чтобы перевести десятичное число в шестнадцатеричное, необходимо выполнить следующие действия:
Проиллюстрируем эти правила примером.
Переведем десятичное число 89 в шестнадцатеричное. Оно больше 16, поэтому разделим его на 16. Частное равно 5 и 9 в остатке. 5 меньше 16, значит, деление прекращается и 5 запомним как последний остаток. То есть у нас есть два остатка: 9 и 5. Теперь их надо записать в обратном порядке, получаем: 89 = 0×59.
Проверим, действительно ли 0×59 равно 89? Распишем его по привычной уже схеме: 0×59 = 5×161 + 9×160 = 5×16 + 9 = 89.
Действительно, получилось. Но в выбранном мной примере число 89 очень быстро закончилось, если так можно сказать. В противном случае деление потребовалось бы продолжить. Покажем это на более сложном примере. Возьмем число 3728: 3728 / 16 = 233 и 0 в остатке. Затем 233 / 16 = 14 и 9 в остатке. Результат этого деления равен 14, он меньше 16. Деление заканчиваем и запоминаем этот результат деления как последний остаток. Нам осталось лишь записать эти остатки в обратном порядке и заменить десятичное число 14 на шестнадцатеричную цифру E. Итак, искомое число 0xE90.
В качестве домашнего задания можете перевести это число в десятичное и проверить, действительно ли 0xE90 равно 3728?
На этом месте статья заканчивалась, я решил ее несколько дополнить. Продолжаем.
Сложение шестнадцатеричных чисел
Сначала немного поговорим о правилах. Самое первое — всегда стоит помнить о том, что шестнадцатеричная система счисления позиционная. Об этом я писал в самом начале, но не грех и повторить. Просто из этого правила следует очень важный момент, складывая числа, нужно делать это только с цифрами, находящимися в одинаковых разрядах.
Сначала мы с вами вспомним как складывать числа в столбик в привычной нам десятичной системе счисления и применим эти знания на шестнадцатеричные числа. Всего делов-то! 🙂
Предположим, нам необходимо сложить числа 234 и 49. Для этого мы запишем эти числа одно под другим так, чтобы разряды в них совпадали — единицы под единицами, десятки под десятками и так далее. И складывать будем цифры из одинаковых разрядов, начиная с единиц и идя влево.
Помня о том, что мы пока складываем десятичные числа (10 является основанием системы счисления), складываем разряды по очереди справа налево. 4 + 9 = 13. Наш результат — 13, он больше 10 — нашего основания. В случае, когда результат больше или равен основанию, это самое основание нужно вычесть из результата. В нашем примере от 13 необходимо отнять 10, а новый результат записать под цифрами 4 и 9, отнятую же здесь десятку, перенести в левый разряд как единицу старшего разряда (десять единиц равно одному десятку). В разряде с десятков мы складываем 3 + 4 и добавляем к ним перенесенный 1 десяток. Результат — 8. Он меньше нашего основания, значит под десятками просто записываем 8. Далее складываем сотни. Но двойку не с чем складывать, значит просто переносим ее в результат. Итак: 234 + 49 = 283.
Ровно те же правила сложения чисел действуют в любой позиционной системе счисления. Единственное отличие заключается в том, что результаты сложения цифр в разрядах придется сравнивать с другими основаниями систем счисления.
Переходим к шестнадцатеричным числам. Вспомним, что основание здесь равно 16. И неприятной особенностью являются цифры обозначенные буквами латинского алфавита. Чтобы нам было проще складывать, вспомним, чему они равны:
a = 10, b = 11, c = 12, d = 13, e = 14, f = 15.
Переходим собственно к примеру на сложение. Давайте сложим 0xA15 и 0xBC.
Сначала складываем единицы — 5 + С. Вспоминаем, что с = 12, получаем 5 + 12 = 17. Результат больше основания системы счисления, который равен 16. Значит вычитаем 16 из 17 — равно 1, записываем этот новый результат под правым разрядом, а в левый старший разряд переносим единичку (16 единиц равно одному десятку в шестнадцатеричной системе). Там же складываем 1 + B. Добавляем к этой сумме 1 перенесенный разряд и вспоминаем, что B = 11, получаем: 1 + 1 + 11 = 13. Во-первых: этот результат меньше 16, значит его можно просто записать под складываемыми цифрами, а во-вторых: Число 13 в шестнадцатеричной арифметике записывается буквой D. В разряд сотен при этом ничего не переносится, а цифра A из верхнего слагаемого просто переносится в результат. Несложно заметить, что 0xA15 + 0xBC = 0xAD1.
Вычитание шестнадцатеричных чисел
Начнем мы снова с привычной нам десятичной системы счисления. Давайте решим пример: 123-85.
Вычитание снова происходит поразрядно, но переносы делаются на сей раз слева направо. Поясню. В нашем примере необходимо из 3 отнять 5. Этого сделать нельзя, поэтому мы занимаем один десяток из левого разряда. Теперь 5 нужно отнять от 13. В результате мы получим 8, запишем этот результат под разрядом единиц. От десятков в уменьшаемом (число 123) мы один десяток заняли в разряд единиц. Теперь здесь только 1 десяток. Нам нужно из одного вычесть 8. Для этого снова приходится занять единицу из левого разряда (теперь уже сотен). Значит нужно из 11 вычесть 8. В результате получаем – 3 и записываем его под разрядом десятков. А единственную сотню мы заняли для вычитания десятков. Пример решён: 123-85 = 38.
Перейдем к вычитанию шестнадцатеричных чисел. Все делается аналогично, надо только помнить, что в случае необходимости из левых разрядов мы будем занимать не 10, а 16. Ну и снова вспомним, чему равны цифры старше девятки:
a = 10, b = 11, c = 12, d = 13, e = 14, f = 15.
Давайте решим пример 0xBC4-0xAF.
Из 4 нельзя вычесть F, значит из левого разряда мы займем 16. Теперь F надо вычитать из 20. В результате — 5, записываем его под разрядом единиц. Цифра C уменьшилась на 1, теперь это B. Значит надо A вычесть из B. Нетрудно догадаться, что в результате будет 1. Записываем этот результат в разряде десятков. Из сотен в этот раз мы ничего не занимали и в вычитаемом только 2 цифры — сотен нет, то есть сносим B из уменьшаемого в результат. Итак: 0xBC4-0xAF = 0xB15, пример решен. Было ли сложно? 🙂
Теги раздела
css (1), wordpress (4), изыски словообразования (4), компьютерная теория (9), компьютерный практикум (5), кулинария (1), мобильная связь (1), мои университеты (2), облако тегов (1), проза (33), рифмы (4), свои функции (1), теле2 (1), фельетон (1), шрифты (1), эссе (1), юмор (8)
Оставьте ваш отзыв:
Шестнадцатеричный калькулятор онлайн
Если вам необходимо произвести математические операции в шестнадцатеричной системе счисления воспользуйтесь нашим онлайн калькулятором:
Просто введите шестнадцатеричные числа, выберите операцию и получите результат.
Калькулятор может производить следующие действия:
Сложение в шестнадцатеричной системе счисления
Сложение двух шестнадцатеричных чисел производится столбиком, как и в десятичной системе, но по следующим правилам:
+ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
1 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 |
2 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 | 11 |
3 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 | 11 | 12 |
4 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 | 11 | 12 | 13 |
5 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 | 11 | 12 | 13 | 14 |
6 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 | 11 | 12 | 13 | 14 | 15 |
7 | 7 | 8 | 9 | A | B | C | D | E | F | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
8 | 8 | 9 | A | B | C | D | E | F | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
9 | 9 | A | B | C | D | E | F | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
A | A | B | C | D | E | F | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
B | B | C | D | E | F | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A |
C | C | D | E | F | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B |
D | D | E | F | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C |
E | E | F | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D |
F | F | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E |
Пример
Для примера сложим F4240 и 7A120:
+ | F | 4 | 2 | 4 | 0 | |
7 | A | 1 | 2 | 0 | ||
1 | 6 | E | 3 | 6 | 0 |
F424016 + 7A12016 = 16E36016
(1 000 00010 + 500 00010 = 1 500 00010)
Вычитание в шестнадцатеричной системе счисления
Правила вычитания шестнадцатеричных чисел обратны правилам сложения (см. таблицу выше).
Пример
Для примера вычтем из числа 16E360 число F4240:
– | 1 | 6 | E | 3 | 6 | 0 |
F | 4 | 2 | 4 | 0 | ||
7 | A | 1 | 2 | 0 |
16E36016 − F424016 = 7A12016
(1 500 00010 − 1 000 00010 = 500 00010)
Умножение чисел в шестнадцатеричной системе счисления
Умножение шестнадцатеричных чисел производится по следующим правилам:
× | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
2 | 0 | 2 | 4 | 6 | 8 | A | C | E | 10 | 12 | 14 | 16 | 18 | 1A | 1C | 1E |
3 | 0 | 3 | 6 | 9 | C | F | 12 | 15 | 18 | 1B | 1E | 21 | 24 | 27 | 2A | 2D |
4 | 0 | 4 | 8 | C | 10 | 14 | 18 | 1C | 20 | 24 | 28 | 2C | 30 | 34 | 38 | 3C |
5 | 0 | 5 | A | F | 14 | 19 | 1E | 23 | 28 | 2D | 32 | 37 | 3C | 41 | 46 | 4B |
6 | 0 | 6 | C | 12 | 18 | 1E | 24 | 2A | 30 | 36 | 3C | 42 | 48 | 4E | 54 | 5A |
7 | 0 | 7 | E | 15 | 1C | 23 | 2A | 31 | 38 | 3F | 46 | 4D | 54 | 5B | 62 | 69 |
8 | 0 | 8 | 10 | 18 | 20 | 28 | 30 | 38 | 40 | 48 | 50 | 58 | 60 | 68 | 70 | 78 |
9 | 0 | 9 | 12 | 1B | 24 | 2D | 36 | 3F | 48 | 51 | 5A | 63 | 6C | 75 | 7E | 87 |
A | 0 | A | 14 | 1E | 28 | 32 | 3C | 46 | 50 | 5A | 64 | 6E | 78 | 82 | 8C | 96 |
B | 0 | B | 16 | 21 | 2C | 37 | 42 | 4D | 58 | 63 | 6E | 79 | 84 | 8F | 9A | A5 |
C | 0 | C | 18 | 24 | 30 | 3C | 48 | 54 | 60 | 6C | 78 | 84 | 90 | 9C | A8 | B4 |
D | 0 | D | 1A | 27 | 34 | 41 | 4E | 5B | 68 | 75 | 82 | 8F | 9C | A9 | B6 | C3 |
E | 0 | E | 1C | 2A | 38 | 46 | 54 | 62 | 70 | 7E | 8C | 9A | A8 | B6 | C4 | D2 |
F | 0 | F | 1E | 2D | 3C | 4B | 5A | 69 | 78 | 87 | 96 | A5 | B4 | C3 | D2 | E1 |
Пример
Для примера перемножим числа 1F4 и 2D:
× | 1 | F | 4 | ||
2 | D | ||||
+ | 1 | 9 | 6 | 4 | |
3 | E | 8 | |||
5 | 7 | E | 4 |
1F416 × 2D16 = 57E416
(50010 × 4510 = 2250010)
Деление шестнадцатеричных чисел
Деление шестнадцатеричных чисел выполняется по тому же принципу, что и деление десятичных, например:
Пример
Для примера разделим число 7D0 на 2:
7D016 ÷ 216 = 3E816
(200010 ÷ 210 = 100010)
См. также
Программа C для преобразования десятичной системы в шестнадцатеричную
Это программа на языке C для преобразования десятичных чисел в шестнадцатеричные.
Описание проблемы
Эта программа принимает на вход десятичное число и преобразует его в шестнадцатеричное.
Решение проблемы
1. Введите десятичное число.
2. Разделите введенное число на 16. Сохраните остаток в массиве.
3. Выполните шаг 2 с полученным частным до тех пор, пока частное не станет равным нулю.
4. Распечатайте массив в обратном порядке, чтобы получить шестнадцатеричное число.
Программа / исходный код
Вот исходный код программы на языке C для преобразования десятичных чисел в шестнадцатеричные. Программа на C успешно скомпилирована и запускается в системе Linux. Вывод программы также показан ниже.
Описание программы
1.В качестве входных данных возьмите десятичное число и сохраните его в переменной decimalnum.
2. Инициализировать переменную j = 0 и скопировать десятичное число в частное переменной.
3. Получите частное и остаток от частного частного. Сохраните полученный остаток в остатке переменной и замените частное переменной полученным частным.
4. Убедитесь, что остаток меньше 10. Если это так, добавьте 48 к остатку и сохраните результат в массиве hexadecimalnum. В противном случае добавьте 55 к остатку и сохраните результат в шестнадцатеричном массиве.
5. Выполняйте шаги 3-4, пока коэффициент переменной не станет равным нулю.
6. Когда он станет равным нулю, выведите шестнадцатеричный массив в обратном порядке в качестве вывода.
Случаи тестирования
Выход: Введите десятичное число: 12 Эквивалентное шестнадцатеричное значение 12: C
Sanfoundry Global Education & Learning Series - Программы 1000 C.
Вот список лучших справочников по программированию, структурам данных и алгоритмам на C
Примите участие в конкурсе сертификации Sanfoundry, чтобы получить бесплатную Почетную грамоту.Присоединяйтесь к нашим социальным сетям ниже и будьте в курсе последних конкурсов, видео, стажировок и вакансий!
Hexadecimal to Binary in C
#include
// функция для преобразования шестнадцатеричного числа в двоичное
void HexToBin (char * hexdec)
{
long int i = 0;
while (hexdec [i]) {
switch (hexdec [i]) {
case '0':
printf («0000»);
перерыв;
case '1':
printf ("0001");
перерыв;
case '2':
printf ("0010");
перерыв;
case '3':
printf ("0011");
перерыв;
case '4':
printf ("0100");
перерыв;
case '5':
printf ("0101");
перерыв;
case '6':
printf ("0110");
перерыв;
case '7':
printf ("0111");
перерыв;
case '8':
printf ("1000");
перерыв;
case '9':
printf ("1001");
перерыв;
case 'A':
case 'a':
printf ("1010");
перерыв;
case 'B':
case 'b':
printf ("1011");
перерыв;
case 'C':
case 'c':
printf ("1100");
перерыв;
case 'D':
case 'd':
printf ("1101");
перерыв;
case 'E':
case 'e':
printf ("1110");
перерыв;
case 'F':
case 'f':
printf ("1111");
перерыв;
по умолчанию:
printf ("\ nНеверная шестнадцатеричная цифра% c",
hexdec [i]);
}
i ++;
}
}
// код драйвера
int main ()
{
// Получить шестнадцатеричное число
char hexdec [100] = "1AC5";
// Преобразование шестнадцатеричного числа в двоичное
printf ("\ nЭквивалентное двоичное значение:");
HexToBin (шестнадцатеричный);
}
3 способа преобразования десятичного числа в шестнадцатеричное в программировании на C
Программа на C для преобразования десятичного числа в шестнадцатеричное
Узнайте, как преобразовать десятичное число в шестнадцатеричное на языке программирования C.Этот код C для преобразования десятичного числа в шестнадцатеричный использует функцию pow (), , цикл While, и цикл For .
Десятичное число
Десятичное число имеет основание 10 и включает следующие цифры: 0 1 2 3 4 5 6 7 8 9
Шестнадцатеричное число
Шестнадцатеричное число имеет основание 16 и включает следующие значения : 0 1 2 3 4 5 6 7 8 9 ABCDEF где,
A = 10, B = 11, C = 12, D = 13, E = 14, F = 15.
Примечание: Эта программа на C для преобразования десятичных в шестнадцатеричные числа скомпилирована с помощью компилятора GNU GCC и написана в редакторе gEdit в операционной системе Linux Ubuntu.
Метод 1: C-программа для преобразования десятичного значения в шестнадцатеричное с использованием цикла while
1 2 3 4 5 6 7 8 11 12 13 14 15 16 17 18 19 | #include #include int main () { int decimal_number, остаток, hexadecimal_number = 0; int count = 0; printf («Введите десятичное число: \ t»); scanf ("% d", & десятичное_число); , а (десятичное_число! = 0) { остаток = десятичное_число% 16; шестнадцатеричное_число = шестнадцатеричное_число + остаток * pow (10, count); десятичное_число = десятичное_число / 16; счет ++; } printf ("\ nШестнадцатеричный эквивалент: \ t% d \ n", шестнадцатеричное_число); возврат 0; } |
Метод 2: Программа C для преобразования десятичного числа в шестнадцатеричное с использованием цикла For
1 2 3 4 5 6 6 9 10 11 12 13 14 15 16 17 18 | #include #include int main () { int decimal_number, остаток, hexadecimal_number = 0; int count; printf («Введите десятичное число: \ t»); scanf ("% d", & десятичное_число); для (count = 0; decimal_number> 0; count ++) { остаток = decimal_number% 16; шестнадцатеричное_число = шестнадцатеричное_число + остаток * pow (10, count); десятичное_число = десятичное_число / 16; } printf ("\ nШестнадцатеричный эквивалент: \ t% d \ n", шестнадцатеричное_число); возврат 0; } |
Метод 3: Программа на C для преобразования десятичного числа в шестнадцатеричное с использованием функций
1 2 3 4 5 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # включить #include int decimal_to_hexadecimal (int x) { int hexadecimal_number, остаток, count = 0; для (count = 0; x> 0; count ++) { остаток = x% 16; шестнадцатеричное_число = шестнадцатеричное_число + остаток * pow (10, count); х = х / 16; } вернуть шестнадцатеричное_число; } int main () { int decimal_number, результат; printf («Введите десятичное число: \ t»); scanf ("% d", & десятичное_число); результат = десятичное_значное_шестнадцатеричное (десятичное_число); printf ("\ nШестнадцатеричный эквивалент: \ t% d \ n", результат); возврат 0; } |
Вывод
Если у вас есть какие-либо ошибки компиляции или сомнения в этой программе C для преобразования десятичного значения в шестнадцатеричное число, сообщите нам об этом в разделе комментариев ниже.
Связанные
Категория: Программирование на C Теги: Системы счисления
Шестнадцатеричный
Стр. 1 из 3
Шестнадцатеричный формат - это наиболее распространенный способ отображения необработанных данных, находящихся в памяти машины, но если вы не знакомы с ним, вы можете спросить: «Что за шестнадцатеричный ...?»
Что знают программисты
Содержание
* Недавно отредактированный
Что за шестнадцатеричный?
Шестнадцатеричный формат - это наиболее распространенный способ отображения необработанных данных, находящихся в памяти машины или даже на диске.Вы можете с удовольствием программировать на языке высокого уровня, не заботясь о мире, а затем внезапно возникает серьезная ошибка, и вы сталкиваетесь со строкой, показывающей вам адрес проблемы, содержимое регистров процессоров и т. Д., И все это великолепно шестнадцатеричный.
Даже если вы не программируете, наиболее распространенный формат дампа файла - это строки и строки в шестнадцатеричном формате. В старые темные времена программирования на ассемблере вы должны были быть знакомы с шестнадцатеричным, а также с двоичным, а иногда и с восьмеричным.
Если вы не возились с ассемблером или машинной архитектурой, или если вы заснули в первом семестре компьютерных курсов, то вы можете подумать, что шестигранник - это просто проклятие программиста. Чтобы убедиться, что вы лучше знаете, это краткое и очень практичное руководство по шестнадцатеричной адресации и данных. Если вы плохо разбираетесь в математике, не паникуйте, потому что это очень просто, и через несколько минут практики это становится почти второй натурой.
Шестнадцать пальцев
Если бы мы все родились с 16 пальцами!
Мало того, что набор текста был бы более быстрым занятием, мы могли бы считать в шестнадцатеричном естественном виде.
Подсчет - это использование символов для представления каждого числа. Например, 0, 1, 2, 3 и так далее. При использовании этой простой системы проблема в том, что у вас быстро заканчиваются символы. Вам нужен символ для каждого возможного количества вещей.
Решение состоит в том, чтобы использовать метод подсчета разрядов.
В десятичном формате мы все очень довольны этим методом - вы считаете до 9, а затем начинаете снова, записав тот факт, что вы однажды получили 10, записав 1 слева.
В школе нас учат, что каждая цифра слева представляет в 10 раз больше, чем предыдущая цифра. То есть первое значение представляет единицы, второе - 10, третье - 100 и так далее. Это означает, что такое число, как 123, на самом деле:
.
или один лот по 100, два лота по 10 и три лота по 1.
Обычно предполагается, и я не могу придумать лучшего объяснения, что мы считаем по 10 штук, потому что именно столько пальцев у нас есть.
Все это настолько просто, что мы склонны использовать это интуитивно, не имея возможности объяснить, что это происходит. Это делает шок от перехода на другую базу подсчета еще более травматичным.
В шестнадцатеричном формате используется 16 в качестве основы - шестнадцатеричный = 6 и десятичный = 10.
Другими словами, шестнадцатеричная система счета использует «лоты по 16» точно так же, как десятичная система использует «лоты по 10».
Первая проблема, которую необходимо решить, - это как посчитать до первого лота из 16, поскольку есть только десять цифр - от 0 до 9.Решение состоит в том, что мы используем буквы A, B, C, D, E и F, чтобы дополнить то скудное наследство, которое нам даровали только десять пальцев.
Это означает, что счет до 15 идет
0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F.
Единственная сложность - не забыть не говорить «десять» после 9.
Что происходит после счета до F?
Это тот же вопрос, что и после десятичного счета до 9.
Ответ заключается в том, что вы пишете 1 слева, чтобы указать, что вы подсчитали один лот из 16, а затем продолжаете подсчет. Это после того, как F идет 10, которое не является десяти (десятичным) и на самом деле не должно быть сказано как десять, а как «один ноль» или «один ноль».
Следующий вопрос: что стоит после 10 в шестнадцатеричном формате?
Ответ: 11, затем 12 и так далее до 1F.
На данный момент у нас есть еще одна партия из 16, и мы снова начинаем считать с 20 и так далее.Единственная опасность возникает, когда вы достигаете 9F, и возникает соблазн случайно сделать следующее значение 100. Это не потому, что в шестнадцатеричной системе A стоит после 9, поэтому следующее значение - A0 и так далее.
Вы набираете 100 в гексагоне только после того, как отсчитаете до FF.
Забавно, не правда ли?
Как только вы научитесь считать до 100 гексагонов, вам больше не на что будет смотреть. Вы просто продолжаете считать до F и добавляете единицу к месту слева, пока не дойдете до F, и так далее.
Многие языки программирования используют соглашение, впервые использованное в C, о том, что шестнадцатеричное число указывается, начиная с 0x. Итак, если вы посчитали до FF, вы можете записать это как 0xFF.
Помните: шестнадцатеричная разрядная система работает с лотами по 16, а не с лотами по 10.
Шестнадцатеричное число - обзор
5.2.7 Шестнадцатеричное-двоичное преобразование
Шестнадцатеричное число - это число с основанием (или основанием) 16, а его величина является суммой произведения значения каждой цифры в числе (h) и ее позиции (n). Это позволяет создавать числа с цифрами в наборе: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.
Позиция сразу для слева от десятичной точки стоит ноль (0). При перемещении влево из позиции 0 (в целой части числа) позиция увеличивается на 1.Значение цифры имеет вес 16 n , где n - номер позиции. При перемещении вправо от нулевой позиции (в дробную часть числа) позиция уменьшается на 1. Шестнадцать возможных цифр объединяются для создания целых и действительных чисел. В десятичном эквиваленте шестнадцатеричные цифры от A 16 до F 16 представляют собой числа от 10 10 до 15 10 . Таблица 5.7 показывает таблицу преобразования.
Таблица 5.7. Четырехбитное двоичное преобразование шестнадцатерично-десятичного без знака
Шестнадцатеричное число | Десятичное число | 4-разрядное двоичное число без знака | ||||||
---|---|---|---|---|---|---|---|---|
0 | 0 | 1 | ||||||
0001 | ||||||||
2 | 2 | 0010 | ||||||
3 | 3 | 0011 | ||||||
4 | 4 | 0100 5358 | 6 | 6 | 0110 | |||
7 | 7 | 0111 | ||||||
8 | 8 | 1000 | ||||||
9 | 9 | 9 | 9 | 9 | 9 | 1010 | ||
B | 11 | 1011 | ||||||
C | 12 | 110 0 | ||||||
D | 13 | 1101 | ||||||
E | 14 | 1110 | ||||||
F | 15 | 1111 |
Начните с числа (d) | Деление | Остаток | Цифра шестнадцатеричного числа |
---|---|---|---|
Начните с десятичного числа (d = 7) | Разделить на 16 | d / 16 = 7/16 = 0 | 7 | h 0 = 7 |
Шестнадцатеричное число можно прочитать как: 7 10 = (h 0 ) 16 = 7 16 .
Рассмотрим число 100 10 . Процедура преобразования:
Действие | Деление | Остаток | Цифра шестнадцатеричного числа | ||
---|---|---|---|---|---|
Начните с десятичного числа (d = 100) | 4 | h 0 = 4 | |||
Разделить на 16 | d / 16 = 6/16 = 0 | 6 | h 1 = 6 |
Шестнадцатеричное число можно прочитать как: 100 10 = (h 1 h 0 ) 16 = 64 16 .
Рассмотрим число 255 10 . Процедура преобразования:
Начните с числа (d) | Деление | Остаток | Цифра шестнадцатеричного числа |
---|---|---|---|
Начните с десятичного числа (d = 255) | |||
Разделить на 16 | d / 16 = 255/16 = 15 | 15 | h 0 = F |
Разделить на 16 | d / 16 = 15/16 = 0 | 15 | h 1 = F |
Шестнадцатеричное число можно прочитать как: 255 10 = (h 1 h 0 ) 16 = FF 16 .
Преобразование шестнадцатеричного числа в восьмеричное или наоборот осуществляется преобразованием числа в двоичный или десятичный эквивалент и из восьмеричного в шестнадцатеричное число.
Сводная таблица для систем счисления показана в Таблице 5.8. Здесь рассматриваются беззнаковые десятичные числа от 010 до 1510.
Таблица 5.8. Сводка по числовым системам
Десятичное | Двоичное без знака | Восьмеричное | Шестнадцатеричное | BCD | ||||
---|---|---|---|---|---|---|---|---|
0 | 0000 | 3 0 | 1 | 1 | 0001 | |||
2 | 0010 | 2 | 2 | 0010 | ||||
3 | 0011 | 3 | 3 | 4 | 4 | 0100 | ||
5 | 0101 | 5 | 5 | 0101 | ||||
6 | 0110 | 6 | 0110 | 6 0111 | 7 | 7 | 0111 | |
8 | 1000 | 10 | 1000 | |||||
9 | 1001 | 11 | 9 | 1001 | ||||
10 | 1010 | 12 | A | B | 00010001 | |||
12 | 1100 | 14 | C | 00010010 | ||||
13 | 1101 | 15 | E | 00010100 | ||||
15 | 1111 | 17 | F | 00010101 |
Двоичные и десятичные числа могут быть только целыми или действительными числами.В таблице 5.9 показаны двоичные и десятичные числа для действительного числа, представленного 40 битами в двоичном формате, при этом 24 бита представляют собой целую часть числа, а 16 битов представляют собой дробную часть числа.
Таблица 5.9. Таблица десятично-двоичного преобразования с положительной позицией слева от десятичной точки и отрицательной позицией справа от десятичной точки
Двоичная позиция | Беззнаковое двоичное число | Двоичное взвешивание | Десятичное значение |
---|---|---|---|
23 | 100000000000000000000000.0000000000000000 | 2 23 | 8388608 |
22 | 010000000000000000000000,0000000000000000 | 2 22 | 4194304 |
21 | +010000000000000000000000,0000000000000000 | 2 21 | 2097152 |
20 | 000100000000000000000000.0000000000000000 | 2 20 | 1,048,576 |
19 | 000010000000000000000000.0000000000000000 | 2 19 | 524288 |
18 | +000001000000000000000000,0000000000000000 | 2 18 | 262144 |
17 | +000000100000000000000000,0000000000000000 | 2 17 | +131072 |
16 | 000000010000000000000000.0000000000000000 | 2 16 | 65,536 |
15 | 000000001000000000000000.0000000000000000 | 2 15 | 32768 |
14 | +000000000100000000000000,0000000000000000 | 2 14 | 16384 |
13 | 000000000010000000000000,0000000000000000 | 2 13 | 8192 |
12 | 000000000001000000000000.0000000000000000 | 2 12 | 4,096 |
11 | 000000000000100000000000.0000000000000000 | 2 11 | 2,048 |
10 | 000000000000010000000000,0000000000000000 | 2 10 | 1,024 |
9000 | |||
7 | 000000000000000010000000.0000000000000000 | 2 7 | 128 |
6 | 000000000000000001000000.0000000000000000 | 2 6 | 64 |
5080000 | |||
503 00003 | 000000000000000000010000.0000000000000000 | 2 4 | 16 |
3 | 000000000000000000001000.0000000000000000 | 2 3 | 8 |
2 | 000000000000000000000100.0000000000000000 | 2 2 | 4 |
10800000000 2 | |||
1 | |||
1 | 000000000000000000000001.0000000000000000 | 2 0 | 1 |
Десятичная точка (.) | |||
–1 | 000000000000000000000000.1000000000000000 | 2 –1 | 0,5 |
–2 | 000000000000000000000000.0100000000000000 | 2 –2 | 0,25 |
3 000025 | 02 | ||
3 000025 | 8 | ||
–4 | 000000000000000000000000.0001000000000000 | 2 –4 | 0,0625 |
–5 | 000000000000000000000000.0000100000000000 | 2 –5 | 0,03125 |
–6 | 000000000000000000000000.0000010000000000 | 2 –6 | 0,015625 | 0,015625 |
0,015625 | |||
–8 | 000000000000000000000000.0000000100000000 | 2 –8 | 0.003 |
–9 | 000000000000000000000000.0000000010000000 | 2 -9 | |
-10 000000000000000000000000,0000000001000000 | 2 -10 | ||
-11 000000000000000000000000,0000000000100000 | 2 -11 | ||
–12 | 000000000000000000000000.0000000000010000 | 2 –12 | 0.00024414063 |
–13 | 000000000000000000000000.0000000000001000 | 2 -13 | |
-14 +000000000000000000000000,0000000000000100 | 2 -14 | ||
-15 000000000000000000000000,0000000000000010 | 2 -15 | ||
–16 | 000000000000000000000000.0000000000000001 | 2 –16 | 0.000015258789 |
Битовые манипуляции в C
Битовые манипуляции в C
Программа, с которой вы будете работать для назначения в девятой главе диспетчера памяти, должна выполнять некоторые операции манипулирования битами. Для тех из вас, кто никогда не выполнял манипуляции с битами в C, вот краткое руководство по функциям языка C, необходимым для этого.
Шестнадцатеричная система счисления
Первое, что вам нужно знать, это как представлять последовательности битов.Наиболее широко используемый метод представления битовых последовательностей в C - использование шестнадцатеричных чисел. Шестнадцатеричная система счисления представляет собой систему счисления с основанием 16, в которой каждая цифра представляет собой последовательность из четырех битов. Вот таблица цифр в шестнадцатеричной системе счисления, а также двоичный эквивалент каждой из этих цифр.
Цифра | Двоичная | |
---|---|---|
0 | 0000 | |
1 | 0001 | |
2 | 0010 | |
5 | 0101 | |
6 | 0110 | |
7 | 0111 | |
8 | 1000 | |
9 | 1011 | |
c | 1100 | |
d | 1101 | |
e | 1110 | |
f | 1111
Вы можете создавать более длинные битовые последовательности, используя большее количество шестнадцатеричных цифр. Например, если вам нужно представить битовую последовательность
1000010011001110
сначала разбейте его на группы по четыре бита
1000 0100 1100 1110
, а затем используйте приведенную выше таблицу для преобразования каждой битовой последовательности в ее шестнадцатеричный эквивалент.
0x84ce
Поразрядные операторы C
После того, как вы настроили битовую последовательность, вы захотите иметь доступ и управлять отдельными битами в битовой последовательности. и ~
.
Оператор ~
- это оператор побитового отрицания, который переворачивает каждый бит в последовательности на противоположный. Например, если беззнаковая переменная
x
содержит 0xb = 1011, ~ x
оценивается как 0100, то есть 0x8.
Оператор и
- это побитовый логический оператор и, который формирует логическое и из пар битов, взятых из двух чисел. Например, если у нас есть две беззнаковых переменных
x
и y
, содержащих значения 0xa = 1010 и 0x6 = 0110, x & y
будет оценивать как (1010) & (0110) = (0010) = 0x2.(0110) = (1100) = 0xc.
Работа с отдельными битами
Эти операторы побитовых манипуляций используются для манипуляций на уровне битов, таких как проверка значения отдельных битов или манипулирование отдельными битами в битовой последовательности.
Чтобы проверить значение определенного бита в числе, мы используем побитовый оператор and &
. Например, чтобы определить, является ли последний бит числа 0 или 1, мы формируем побитовое и числа с помощью специально созданной маски с номером .В этом случае номер маски, который мы будем использовать, - это номер, все цифры которого равны 0, за исключением 1 в последней позиции. Например, если у нас есть короткая переменная x без знака со значением 0xa8 = 10101000, и мы хотим определить, равен ли последний бит 0, мы будем использовать тест
х & 0x01 == 0
Мы можем получить доступ к другим битам числа, просто изменив маску и
на x. Например, чтобы проверить, равен ли третий бит 1, мы должны использовать
х & 0x20 == 0x20
Чтобы установить биты числа в определенные значения, мы используем либо |
или и
в зависимости от того, хотим ли мы установить этот бит равным 1 или 0.Например, чтобы установить четвертый бит в восьмибитной переменной y
равным 1, мы должны использовать
у = у | 0x10
Чтобы установить четвертый бит y
в 0, мы должны использовать и
с маской 0xef = 11101111:
у = у & 0xef
Другой способ сделать это - использовать оператор ~
для построения маски:
у = у & (~ 0x10)
Целочисленные константы C | Документы Microsoft
В этой статье
Целочисленная константа - это десятичное (основание 10), восьмеричное (основание 8) или шестнадцатеричное (основание 16) число, представляющее целое значение.Используйте целочисленные константы для представления целочисленных значений, которые нельзя изменить.
Синтаксис
целочисленная константа :
десятичная константа целочисленный суффикс opt
восьмеричная константа целочисленный суффикс opt
шестнадцатеричная константа opt целочисленный суффикс
десятичная константа :
ненулевая цифра
десятичная константа цифра
восьмеричная константа :
0
восьмеричная постоянная восьмеричная цифра
шестнадцатеричная константа :
шестнадцатеричный префикс шестнадцатеричная цифра
шестнадцатеричная константа шестнадцатеричная цифра
шестнадцатеричный префикс : один из
0x 0X
ненулевая цифра : одна из
1 2 3 4 5 6 7 8 9
восьмеричная цифра : одна из
0 1 2 3 4 5 6 7
шестнадцатеричная цифра : одна из
0 1 2 3 4 5 6 7 8 9
a b c d e f
A B C D E F
целочисленный суффикс :
беззнаковый суффикс длинный суффикс opt
беззнаковый суффикс длинный-длинный суффикс
беззнаковый суффикс 64-битный целочисленный суффикс 900 длинный суффикс беззнаковый суффикс opt
длинный-длинный суффикс беззнаковый суффикс opt
64-битный целочисленный суффикс
беззнаковый суффикс : один из
u U
длинный суффикс : один из
л L
длинный-длинный суффикс : один из
ll LL
64-битный целочисленный суффикс : один из
i64 I64
Суффиксы i64 и I64 специфичны для Microsoft.
Целочисленные константы являются положительными, если им не предшествует знак минус (–). Знак минус интерпретируется как оператор унарного арифметического отрицания. (Для получения информации об этом операторе см. Унарные арифметические операторы.)
Если целочисленная константа начинается с 0x или 0X , она является шестнадцатеричной. Если он начинается с цифры 0 , он восьмеричный. В противном случае предполагается, что он десятичный.
Следующие целые константы эквивалентны:
28
0x1C / * = шестнадцатеричное представление для десятичного числа 28 * /
034 / * = Восьмеричное представление для десятичного числа 28 * /
Никакие символы пробела не могут разделять цифры целочисленной константы.В этих примерах показаны некоторые допустимые десятичные, восьмеричные и шестнадцатеричные константы.
/ * Десятичные константы * /
int dec_int = 28;
беззнаковый dec_uint = 4000000024u;
long dec_long = 2000000022л;
беззнаковый длинный dec_ulong = 4000000000ul;
long long dec_llong = 00000LL;
беззнаковый длинный длинный dec_ullong =
0000001ull;
__int64 dec_i64 = 00000002I64;
беззнаковый __int64 dec_ui64 =
000000004ui64;
/ * Восьмеричные константы * /
int oct_int = 024;
беззнаковый oct_uint = 04000000024u;
long oct_long = 02000000022l;
беззнаковый длинный oct_ulong = 04000000000UL;
long long oct_llong = 044000000000000ll;
unsigned long long oct_ullong = 044400000000000001Ull;
__int64 oct_i64 = 04444000000000000002i64;
беззнаковый __int64 oct_ui64 = 04444000000000000004uI64;
/ * Шестнадцатеричные константы * /
int hex_int = 0x2a;
беззнаковый hex_uint = 0XA0000024u;
long hex_long = 0x20000022l;
беззнаковый длинный hex_ulong = 0XA0000021uL;
long long hex_llong = 0x8a000000000000ll;
беззнаковый длинный длинный hex_ullong = 0x8A40000000000010uLL;
__int64 шестнадцатеричный_i64 = 0x4a44000000000020I64;
беззнаковый __int64 hex_ui64 = 0x8a44000000000040Ui64;