Что означают «0b» и «0x» при назначении двоичного и шестнадцатеричного кодов?
При непосредственном присвоении двоичного значения и шестнадцатеричного значения вы можете сделать это следующим образом (соответственно):
Также в качестве еще одного любопытного вопроса, какие еще символы могут идти вместо «b» и «x»? Есть ли один для восьмеричного в качестве примера?
3 ответа
Любые целочисленные литералы, которые вы можете создать, суммированы в стандарте C ++ путем создания грамматики по адресу [ lex.icon ]
Как мы можем вывести из грамматики, существует четыре типа целочисленных литералов:
Ведущие 0 для восьмеричных чисел можно рассматривать как «O» в «Octal». Другие префиксы используют начальный ноль, чтобы отметить начало числа, которое не должно интерпретироваться как десятичное. «B» интуитивно понятно для « b inary», а «X» для «он x adecimal».
В отсутствие суффикса определяемого пользователем литерала любой числовой литерал, начинающийся с ненулевого значения, находится в динаре.
В мире C ++ есть грохот, чтобы использовать 0o для восьмеричного литерала и, возможно, даже отказаться от поддержки ведущей нулевой версии. Хотя это было бы ужасным переломным моментом.
Они означают, что числовой литерал находится соответственно в двоичной и шестнадцатеричной основе.
Можете ли вы иметь другие значения вместо 0?
Числовой литерал, начинающийся с ненулевой цифры, будет десятичным.
Также в качестве еще одного любопытного вопроса, какие еще символы могут идти вместо «b» и «x»?
Помимо b и x, любая восьмеричная цифра может идти туда, и в этом случае она является самой значимой цифрой восьмеричного литерала.
Почему шестнадцатеричные числа имеют префикс 0x?
4 ответов
язык BCPL используется синтаксис 8 1234 для восьмеричных чисел. Когда Кен Томпсон создал B из BCPL, он использовал 0 префикс вместо этого. Это здорово, потому что
C# является потомком C, поэтому он наследует синтаксис.
примечание: Я не знаю правильного ответа, но ниже-это только мои личные домыслы!
как уже упоминалось, 0 перед числом означает, что оно восьмеричное:
вы не можете привести с персонажем по той же причине:
использование хэша, вероятно, было выброшено, потому что он конфликтует с препроцессором:
в конце концов, по какой-то причине, они решили поставить x после ведущего 0, чтобы обозначить шестнадцатеричное. Он однозначен, поскольку он все еще начинается с символа числа, поэтому не может быть допустимым идентификатором и, вероятно, основан на восьмеричное соглашение ведущего 0.
простой
это префикс, указывающий, что число находится в шестнадцатеричном, а не в какой-либо другой базе. Язык программирования C использует его для передачи компилятору.
пример :
на Бинарные будет
Надежда каким-то образом помогла.
Добрый день,
предыдущий 0 используется для указания числа в базе 2, 8 или 16.
на мой взгляд, 0x был выбран для обозначения hex, потому что » x » звучит как hex.
только мое мнение, но я думаю, что это имеет смысл.
Перевод чисел из одной системы счисления в другую
Данный конвертер переводит числа между наиболее популярными системами счисления: десятичной, двоичной, восьмеричной, шестнадцатеричной.
Существуют и другие системы счисления, но мы не стали включать их в конвертер из-за низкой популярности.
Для указания системы счисления при записи числа используется нижний индекс, который ставится после числа:
20010 = 110010002 = 3108 = C816
Кратко об основных системах счисления
Десятичная система счисления. Используется в повседневной жизни и является самой распространенной. Все числа, которые нас окружают представлены в этой системе. В каждом разряде такого числа может использоваться только одна цифра от 0 до 9.
Двоичная система счисления. Используется в вычислительной технике. Для записи числа используются цифры 0 и 1.
Восьмеричная система счисления. Также иногда применяется в цифровой технике. Для записи числа используются цифры от 0 до 7.
Перевод в десятичную систему счисления
Перевод из десятичной системы счисления в другие
Делим десятичное число на основание системы, в которую хотим перевести и записываем остатки от деления. Запишем полученные остатки в обратном порядке и получим искомое число.
Переведем число 37510 в восьмеричную систему:
Перевод из двоичной системы в восьмеричную
Так же как и в первом способе разбиваем число на группы. Но вместо преобразований в скобках просто заменим полученные группы (триады) на соответствующие цифры восьмеричной системы, используя таблицу триад:
Перевод из двоичной системы в шестнадцатеричную
Также как и в первом способе разбиваем число на группы по 4 цифры. Заменим полученные группы (тетрады) на соответствующие цифры шестнадцатеричной системы, используя таблицу тетрад:
| Тетрада | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Цифра | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
Перевод из восьмеричной системы в двоичную
Каждый разряд восьмеричного числа будем делить на 2 и записывать остатки в обратном порядке, формируя группы по 3 разряда двоичного числа. Если в группе получилось меньше 3 разрядов, тогда дополняем нулями. Записываем все группы по порядку, отбрасываем ведущие нули, если имеются, и получаем двоичное число.
Используем таблицу триад:
Каждую цифру исходного восьмеричного числа заменяется на соответствующие триады. Ведущие нули самой первой триады отбрасываются.
Перевод из шестнадцатеричной системы в двоичную
Аналогично переводу из восьмеричной в двоичную, только группы по 4 разряда.
Используем таблицу тетрад:
| Цифра | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Тетрада | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
Каждую цифру исходного числа заменяется на соответствующие тетрады. Ведущие нули самой первой тетрады отбрасываются.
Перевод из восьмеричной системы в шестнадцатеричную и наоборот
Такую конвертацию можно осуществить через промежуточное десятичное или двоичное число. То есть исходное число сначала перевести в десятичное (или двоичное), и затем полученный результат перевести в конечную систему счисления.
Понимание значения & 0xff в Java
Узнайте, как использовать значение 0xff с побитовым оператором И в Java.
1. Обзор
0xff – это число, представленное в шестнадцатеричной системе счисления (база 16). Он состоит из двух F чисел в шестнадцатеричном формате. Как мы знаем, F в шестнадцатеричном формате эквивалентно 1111 в двоичной системе счисления. Итак, 0xff в двоичном формате-это 11111111.
2. Представление 0xff С Различными Типами Данных
3. Общее использование операции & 0xff
4. Извлечение Цветовых Координат RGB С помощью & 0xff
Так, x в двоичном формате будет представлено как 00010000 00111001 10101000 00000111 — что эквивалентно 272214023 в десятичной системе счисления.
Теперь у нас есть значение x в десятичной системе счисления, и мы хотим извлечь значение для каждого параметра.
Как мы знаем, операция >> сдвигает биты вправо. Поэтому, когда мы это делаем (10000000 00000000 >> 8), это дает нам 10000000. В результате мы можем извлечь значение каждого параметра :
5. Заключение
В этом уроке мы обсудили, как операция & 0xff эффективно делит переменную таким образом, что оставляет только значение в последних 8 битах и игнорирует остальные биты. Как мы уже видели, эта операция особенно полезна, когда мы сдвигаем переменную вправо и нам нужно извлечь сдвинутые биты.
За один проход
Среди задач по программированию часто попадаются такие: дана последовательность однотипных элементов (обычно это числа), требуется за один проход по ней найти какую-нибудь характеристику (среднее квадратическое отклонение, количество минимальных элементов, непрерывный участок с наибольшей суммой. ) Дополнительное ограничение — последовательность может быть очень длинной, и в память не поместится. Других ограничений на элементы последовательности, обычно, не накладывается.
С этими задачами всё, более или менее, понятно: нужно найти то, что на мехмате МГУ называют «индуктивным расширением» искомой функции, и реализовать её вычисление. Если найти не удалось (требуемый объём памяти слишком велик), то задача не решается.
Но попадаются и другие задачи. В них есть дополнительные ограничения на элементы последовательности в совокупности, и эти ограничения приходится существенно использовать для решения (и проверять их не надо). Простейшая такая задача выглядит так:
Задача 1. В последовательности записаны целые числа от 1 до N в произвольном порядке, но одно из чисел пропущено (остальные встречаются ровно по одному разу). N заранее неизвестно. Определить пропущенное число
Решение очевидно: просматриваем числа, находим их количество K и сумму S. По условию, N=K+1, значит, сумма чисел от 1 до N будет равна (K+1)*(K+2)/2, и пропущенное число равно (K+1)*(K+2)/2-S. Если вы почему-то боитесь переполнений, то работайте с беззнаковыми числами (там переполнения не страшны — но будьте осторожны при вычислении (K+1)*(K+2)/2 🙂 ), или вместо суммы ищите XOR всех чисел.
Задача 2. В последовательности записаны целые числа. Одно из чисел встречается ровно один раз, остальные — по два раза. Найти число, которое встречается один раз.
Здесь тоже всё просто: найдем XOR всех чисел — он и будет ответом. В самом деле, если какой-то бит в искомом числе равен нулю, то во всей последовательности он будет равен 1 в чётном числе элементов, и его значение в XOR равно нулю. В противном случае, аналогично, его значение в XOR равно 1. Или, проще говоря, одинаковые элементы при суммировании взаимоуничтожатся.
Слегка усложним задачу:
Задача 3. В последовательности записаны целые числа. Число X встречается один или два раза, остальные числа — по три раза. Найти число X. Для простоты считаем, что числа неотрицательные.
А если сделать ещё один шаг?
Задача 4. В последовательности записаны целые числа. Число X встречается 1,2 или 3 раза, остальные числа — по 4 раза. Найти число X.
Предыдущий подход здесь уже не сработает: если мы возьмём систему счисления с основанием 4, и найдём поразрядные суммы, то для случаев, когда X встретился один или три раза, всё будет хорошо. Но если X встретился дважды, мы уже не сможем узнать, была ли очередная цифра равна 0 или 2 — значение суммы si для этого разряда в обоих случаях будет равно нулю. Что делать?
На самом деле, в прошлый раз я вас обманул. Совершенно незачем возиться с троичной системой — достаточно было посчитать сумму битов в каждом двоичном разряде, и если она делилась на 3, то в числе X соответствующий бит равнялся нулю. Если нет — то единице.
В этой задаче делаем точно так же, но проверяем делимость на 4. Например, эти задачи можно решить так:
Задача 5. В длинной очереди стоят люди. Для каждого из них, кроме последнего, записали его имя и имя того, кто стоит за ним. Полученные записи перемешали и записали в файл. Требуется за один просмотр файла определить имена первого и последнего человека. Известно, что эти имена различны (иначе задача неразрешима), но, в общем, имена могут повторяться. Имя каждого человека состоит из шестнадцати 8-битных символов.
С помощью этого приёма можно, также, найти разность множеств, одно из которых получается из другого добавлением двух или даже трёх элементов (или добавлением двух и удалением одного). Если различия более сильные, приходится хранить суммы конъюнкций не только пар, но и троек битов. И XOR там уже недостаточно — приходится считать хотя бы трёхбитные знакопеременные суммы.
UPD: В обсуждении этой задачи в комментариях SeptiM предложил более простое решение. Рассматриваем имена как 128-битные целые числа (xi,yi), и считаем суммы S1=sum(xi-yi), S2=sum(xi^2-yi^2) (первая сумма должна быть знаковой 129-битной, вторая — знаковой 257-битной. Переполнения игнорируем, работаем по модулю 2^129 и 2^257 соответственно). Понятно, что их значения равны S1=x1-xn, S2=x1^2-xn^2, где x1 — первое имя, xn — последнее. Отсюда легко находим x1=(S1+S2/S1)/2, xn=x1-S1.
Задача 6. В последовательности записаны целые числа, больше половины из которых равны одному и тому же числу X. За один просмотр последовательности найти это число.
Заметим, что если мы вычеркнем из последовательности два различных числа, то условие задачи останется верным. Поэтому мы можем вычёркивать пары различных чисел до тех пор, пока все элементы не станут равными одному и тому же числу. Это число и будет X.
Чтобы реализовать этот метод, заведём ячейку, в которой будет храниться какой-то элемент последовательности, и счётчик — сколько копий этого элемента у нас просмотрено и пока не вычеркнуто.
Когда мы читаем очередной элемент, у нас есть три варианта:
— Счётчик равен нулю. Кладём прочитанный элемент в ячейку, увеличиваем счётчик на 1.
— Элемент равен значению ячейки. Увеличиваем счётчик на 1.
— Элемент не равен значению ячейки. Уменьшаем счётчик на 1.
После того, как мы просмотрим всю последовательность, в ячейке окажется искомое число.
К сожалению, обобщить это решение на случай, когда число X встречается больше, чем в 1/k случаев (k известно), не удаётся. Мы можем так же завести k-1 ячейку со счётчиком, удалять за один раз по k различных элементов, получим в конце k-1 кандидата на роль X, но опознать его нам не удастся — даже значение счётчика у него будет не самым большим. Зато если нам разрешат сделать второй проход, мы можем посчитать, сколько раз каждый из кандидатов встретился в последовательности, и выдать гарантированно самого частого.
У исходной задачи есть ещё одно решение. Для каждого бита считаем, сколько раз он равнялся 0, а сколько — 1, и выдаём более частое значение. Возможно, его удастся обобщить на случай, когда X встречается больше, чем в 1/3 случаев — посчитаем статистику для каждой пары битов… вдруг поможет?
Следующие две очень похожие задачи за один проход решить вряд ли получится. Но для них есть интересное решение за log(M) проходов.
Задача 7. В последовательности записаны целые неотрицательные числа, меньшие M, причём известно, что каждое число встречается не более одного раза. Найти наименьшее число, которое в этой последовательности не встречается.
Задача 8. В последовательности записано M+1 целое неотрицательное число, все числа меньше M. Найти какое-нибудь число, которое встречается хотя бы дважды.
Есть ещё задачка, которая меня давно интересует, но решения которой я не знаю.
Задача 9. В последовательности записаны числа от 1 до N в каком-то порядке. Каждое число встречается один раз. N заранее известно. Требуется за один просмотр последовательности определить чётность записанной в ней перестановки. Какой минимальный объём памяти для этого требуется?
Парадокс заключается в том, что в любой заранее выбранный момент нам достаточно помнить 1 бит информации. Но после этого будет необходимо иметь N+1 бит — чтобы запомнить, какие элементы идут в последовательности после этого момента.