Как перевести из десятичной в двоичную c
Перейти к содержимому

Как перевести из десятичной в двоичную c

Лекция 7. Битовые поля и побитовые операции¶

В настоящее время применяются позиционные системы счисления, изобретённые в Древней Индии.

Основные используемые системы счисления:

  1. Двоичная (алфавит \(A_2=<0,1>\) ).
  2. Десятичная (алфавит \(A_<10>=<0,1,2,3,4,5,6,7,8,9>\) ).
  3. Шестнадцатеричная (алфавит \(A_<16>=<0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f>\) ).

Принцип формирования числа:

\(n = a_(o)^+. +a_1(o)+a_0\)

\(o\) — основание системы счисления (2,10,16).

\(a\) — значение разряда.

\(m\) — номер разряда.

Перевод из двоичной в десятичную¶

Имеем двоичное число \(n_<2>=00101001\) .

Ему соответствует десятичное \(n_<10>=0*(2)^7+0*(2)^6+1*(2)^5+0*(2)^4+1*(2)^3+0*(2)^2+0*(2)^1+1*(2)^0=32+8+1=41\)

Числа, содержащие по одной единице легко запоминаются:

\(00000001\) \(1\)
\(00000010\) \(2\)
\(00000100\) \(4\)
\(00001000\) \(8\)
\(00010000\) \(16\)
\(00100000\) \(32\)
\(01000000\) \(64\)
\(10000000\) \(128\)

Несложно выполнить перевод, если числа содержат несколько идущих подряд единиц:

\(00000011\) \(4-1=3\)
\(00000111\) \(8-1=7\)
\(00001111\) \(16-1=15\)
\(00011111\) \(32-1=31\)
\(00111111\) \(64-1=63\)
\(01111111\) \(128-1=127\)
\(11111111\) \(256-1=255\)
Перевод из десятичной в двоичную¶

Пусть дано \(n_<10>=57\)

  1. Разделить 57 на 2: 28 — 1 (с остатком)
  2. Разделить 28 на 2: 14 — 0 (без остатка)
  3. Разделить 14 на 2: 7 — 0 (без остатка)
  4. Разделить 7 на 2: 3 — 1 (с остатком)
  5. Разделить 3 на 2: 1 — 1 (с остатком)
  6. Разделить 1 на 2: 0 — 1 (с остатком)

Пишем значения разрядов в обратном порядке.

В результате получаем \(n_2=111001\) .

Перевод из шестнадцатиричной в десятичную¶
Перевод из шестнадцатиричной в двоичную¶

Удобно переводить шестнадцатиричное число в двоичное по тетрадам:

Рассмотрим число \(8a\)

\(8\) \(a\)
\(1000\) \(1010\)

Арифметика¶

Сложение¶

_images/add.png

Вычитание¶

_images/sub.png

Знак числа¶

_images/nums.png

Порядок байтов¶

Little Endian vs. Big Endian¶

_images/endian.png

Используется два порядка расположения байтов в многобайтной величине: от старшего к младшему big endian и от младшего к старшему little endian.

_images/5.png

BE используют: IBM 360/370/390, Motorola 68000, SPARC

LE используют: Intel x86

Достоинства LE¶

Существенным достоинством little-endian по сравнению с big-endian порядком записи считается возможность ‘’неявной типизации’’ целых чисел при чтении меньшего объёма байт.

Так, если в ячейке памяти содержится число 0x00000022, то прочитав его как int16 (два байта) мы получим число 0x0022, прочитав один байт — число 0x22. Однако, это же может считаться и недостатком, потому что провоцирует ошибки потери данных.

Проверка¶

Следующие функции позволяют проверить, какой порядок байт принят в вашей системе:

Использование полей битов¶

Очень полезное с практической точки зрения представление памяти в 1 байт, которое можно использовать как unsigned char или как набор значений отдельных битов.

Функция, переводящая байт из 10-тичной системы в 2-ичную с использованием поля битов:

Побитовые операции¶

Обзор¶

Побитовые операции¶

Побитовые операции применяются к значениям отдельных разрядов числа и их не следует путать с обычными логическими операциями (&&, ||,!), которые действуют на значение в целом.

  • & — умножение (конъюнкция)
  • \(|\) — сложение (дизъюнкция)

Вместе с этими операциями может использоваться присваивание, например a>>=2

Отрицание¶

Поразрядное отрицание alert<

Следующая функция возвращает максимальное значение unsigned int в вашей системе:

Поразрядное ‘’И’‘¶

Операция & ‘’И’’ является бинарной и выставляет результирующий бит в 1, если оба бита операндов равны 1.

_images/lcd1.png

Поразрядное И¶

Преобразование числа в бинарную форму:

Поразрядное ‘’ИЛИ’‘¶

Операция | ‘’ИЛИ’’ является бинарной и выставляет результирующий бит в 1, если хотя бы один бит у операндов равен 1.

_images/lcd2.png

Поразрядное ИСКЛЮЧАЮЩЕЕ ИЛИ¶

Операция ** \(\widehat <**\) >‘’ИСКЛЮЧАЮЩЕЕ ИЛИ’’ является бинарной и выставляет результирующий бит в 1, если первый (или второй) бит операнда равен 1, но не оба одновременно.

_images/lcd3.png

В следующем примере XOR используется для обмена значений двух целочисленных переменных:

Как перевести из десятичной в двоичную c

Completing the CAPTCHA proves you are a human and gives you temporary access to the web property.

What can I do to prevent this in the future?

If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware.

If you are at an office or shared network, you can ask the network administrator to run a scan across the network looking for misconfigured or infected devices.

Another way to prevent getting this page in the future is to use Privacy Pass. You may need to download version 2.0 now from the Chrome Web Store.

Cloudflare Ray ID: 71aa0aaa3ddd5c74 • Your IP : 82.102.23.104 • Performance & security by Cloudflare

Как перевести из десятичной в двоичную c

Побитовые операторы и двоичное представление чисел

Язык программирования С++ обладает полным набором побитовых операторов. Побитовые операторы применяются при выполнении операций с битами в двоичном представлении числовых значений. Прежде чем непосредственно рассмотреть сами операторы, кратко остановимся на концепции двоичного представления числовых значений.

Как известно, целые числа представляются в виде последовательности цифр. Такое представление чисел называется позиционным. Весь набор цифр, которые могут использоваться в позиционном представлении числа, определяют систему счисления. В повседневной жизни используется десятичная система счисления, в которой числа представлены цифрами от 0 до 9.

В программировании более популярны системы счисления с количеством цифр, равным степени двойки: восьмеричная и шестнадцатеричная. Однако двоичная система счисления — вне конкуренции. В этой системе счисления числа записываются последовательностью из двух цифр: 0 и 1.

Каждая позиция в двоичном представлении числа соответствует биту. Таким образом, с помощью бита можно записать два значения: 0 или 1. Если для представления числа используется n бит, то в этом случае существует 2 n различных комбинаций, каждая из которых соответствует отдельному числу. Например, с помощью 8 бит(1 байт) можно записать 2 8 = 256 чисел.

При представлении двоичным кодом положительных чисел можно было бы использовать стандартное математическое представление числа в двоичной системе. Однако на практике приходится иметь дело и с отрицательными числами, причем с технической точки зрения знаком «минус» здесь не обойтись — минус можно написать на бумаге, а реализовать его в памяти компьютера намного сложнее.

Для определения знака числа используют старший бит в позиционной записи. Нулевой старший бит соответствует положительному числу, а единичный старший бит соответствует отрицательному числу. При этом перевод для положительных чисел из двоичной системы счисления в десятичную осуществляется стандартными методами: если в двоичном представлении число позиционно задается как bnbn-1. b2b1b0 (причем цифры bi могут принимать значения 0 или 1, а старший бит для положительных чисел равен 0), то в десятичной системе число вычисляется как b02 0 + b12 1 + b22 2 + . + bn-12 n-1 + bn2 n .

С отрицательными числами дела обстоят несколько сложнее. Чтобы перевести отрицательное число с позиционным представлением в двоичной системе bnbn-1. b2b1b0 (старший бит для отрицательного числа bn = 1), необходимо проделать несложную процедуру из двух этапов.

Во-первых, производится побитовое инвертирование кода, т.е. каждый бит в представлении числа меняется на противоположный: 0 на 1 и 1 на 0.

Во-вторых, результат переводится в десятичную систему и к нему добавляется 1. Это модуль отрицательного числа. Чтобы получить само число, модуль числа необходимо умножить на -1.

Чтобы перевести число из десятичной системы в двоичную, проделывают обратную процедуру: от модуля отрицательного числа отнимается 1, результат переводится в бинарный код, после чего проводится побитовое инвертирование.

Проиллюстрируем это не примере.

Рассмотрим 8-битовое бинарное положительное число 01001011, что в десятичной системе счисления соответствует числу 2 0 + 2 1 + 2 3 + 2 6 = 1 + 2 + 8 + 64 = 75.

Определим бинарное машинное представление для отрицательного числа -75. Отнимем от модуля числа единицу, получаем 74. Бинарное представление для этого числа 01001010 (74 = 2 1 + 2 3 + 2 6 ). После побитового инвертирования из числа 01001010 получаем 10110101. Это и есть представление числа -75.

В том, что это так, легко убедиться: сложим числа 01001010 и 10110101. Формально получаем 100000000, однако поскольку числа 8-битовые, лишний единичный старший бит отбрасывается, и получается представление 00000000, что соответствует нулю, как и должно быть.

Теперь рассмотрим основные побитовые операции и операторы, которые используются для этого в языке программирования С++. Список побитовых операторов приведен в таблице 1.6.

a является число, которое получается побитовым инвертированием числа а.

к числу 5 требует особых пояснений. На самом деле в 8-битовом представлении число 5 имеет вид 00000101. В предыдущих случаях нулевые старшие разряды роли не играли, поэтому они явно не указывались. При инвертировании наличие старших нулевых битов важно. Инвертирование дает 11111010. Это не что иное, как представление в двоичном машинном коде числа -6. Последнее читатель может проверить самостоятельно.

Особенности операций в двоичной системе таковы, что сдвиг в побитовом представлении числа на одну позицию влево означает умножение этого числа на 2. Следует только помнить, что с определенного момента при сдвиге вправо теряются старшие биты.

Представим, что число задается 8 битами.

Если воспользоваться командной 1 << 6, получим в качестве результата значение 2 6 =64.

Действительно, десятичное число 1 в двоичной системе в 8-битовом представлении задается как 00000001. после сдвига влево на 6 позиций получаем 01000000, что в десятичной системе соответствует числу 64.

Однако если воспользоваться командой 1 << 7, получим в качестве результата -128.

Объясняется это следующим обстоятельством

После сдвига влево на 7 позиций из числа 00000001, получаем число 10000000.

Это отрицательное число, о чем свидетельствует старший единичный бит.

Переводя это число в десятичную систему, сначала инвертируем бинарный код и получаем 01111111. Это код числа 127. Чтобы получить конечное значение, необходимо прибавить к этому результату 1 и добавить минус — в результате приходим к значению -128.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *