Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
1

Запись констант в шестнадцатеричной системе

23.08.2019, 14:16. Показов 3263. Ответов 39
Метки нет (Все метки)

Сейчас изучаю библиотеки связанные с блютуз и вот такая интересная штука
почти везде используется 16-теричная система для записи в переменную ,зачем и почему?
вот примеры
C
1
2
3
4
5
uint8_t lap[3] = { 0x33, 0x8b, 0x9e };
-----------------------------------------------------
        ir->lap[0] = 0x33;
        ir->lap[1] = 0x8b;
        ir->lap[2] = 0x9e;
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2019, 14:16
Ответы с готовыми решениями:

Вывод в шестнадцатеричной системе
Нужно написать программу, которая выводит символы от А до Z в таблице. Первый столбец - порядковый...

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

Cout вывод числа в двоичной и шестнадцатеричной системе счисления
Помогите пожалуйста. Как сделать чтобы выводило не... 1 = 100000000000000000000000000000001, а...

Дана строка - запись числа в двоичной системе счисления. Преобразуйте ее в строку - запись числа в шестнадцатеричной системе счисления
Дана строка, представляющая собой запись числа в двоичной системе счисления. Преобразуйте ее в...

39
749 / 352 / 72
Регистрация: 10.06.2014
Сообщений: 2,371
23.08.2019, 18:40 21
ReYalp,
Ну если вам удобно записывать в десятичной системе счисления, то можно и так, ограничений же нет.
У вас возник конкретный вопрос на который был дан ответ. А действовать согласно данным ответам или нет - решать конечно же вам.

К тому же в вашем случае 0-9 не подойдёт, там числа двузначные
1
Продавец времени
5777 / 3186 / 731
Регистрация: 12.03.2015
Сообщений: 15,094
23.08.2019, 18:43 22
ReYalp, Допустим, к LPT-порту присоединена планка из 8 светодиодов, а через переменную uint8_t lpt1 можно читать и писать значения порта (от 0 (всё диоды выключены) до 255 (все диоды светятся)). Допустим, что начальное значение на порту = 51 (4 диода горят, 4 - не горят)
Напиши кусок программы, который:
а) гасит диод д1,
б) зажигает диоды д2 и д3,
ц) состояния диодов д4 и д5 изменяет на противоположное.
Номера диодов: 0 ≤ дi ≤ 7.
------
Сделаешь - поймёшь глубинный смысл.
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 18:49  [ТС] 23
Verevkin, та писал я в универе на ассемблере ,я понимаю "глубинный смысл" ,просто в даном случае НЕ БЫЛО понятно зачем такой подход,ведь здесь нету ни диод и ничего другого,теперь я понял,спасибо

Добавлено через 1 минуту
Verevkin, и даже в С++(или С) имел дело с битами,это все понятно
0
Продавец времени
5777 / 3186 / 731
Регистрация: 12.03.2015
Сообщений: 15,094
23.08.2019, 18:51 24
Цитата Сообщение от ReYalp Посмотреть сообщение
,просто в даном случае НЕ БЫЛО понятно зачем такой подход,ведь здесь нету ни диод и ничего другого,
Тебе описали в общем случае. Что, как и почему в том коде (сверху) - спрашивай у автора этого кода. Телепатов тут нет.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
23.08.2019, 18:53  [ТС] 25
Verevkin, ну я уже понял что к чему и для чего такой подход,спасибо
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
24.08.2019, 18:32 26
ReYalp, четыре бита это 16 (24) и следовательно байт кодируется парой 16-ричных чисел. Для 32 (слово в нашем обыденном понимании) - две праы. Их часто пишут через двоеточие типа A4:FC. Это стандартный подход кодировать байты парой 16-ричных разрядов. Четыре бита и еще четыре бита. Это придумано финикийскими пиратами. Минимальная штурмовая лодка имела по четыре весла с каждой стороны. Трудность была в том, что ещё не было латинского алфавита. То есть пришлось заставить римлян его создать. А цифры потибрили у арабов. Удобно даже для конспирации.
0
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,200
24.08.2019, 22:36 27
Цитата Сообщение от ReYalp Посмотреть сообщение
почти везде используется 16-теричная система для записи в переменную ,зачем и почему?
что бы подчеркнуть идею:
интерес представляет значение бит в числе, а не само число.

когда ты видишь запись вида:
C++
1
uint8_t lap[3] = { 0x33, 0x8b, 0x9e };
ты сразу акцентируешь своё внимание: а не флаги ли у нас тут?

если бы там обычные десятичные циферки стояли бы,
тогда этот массив 8 битных чисел так бы и воспринимался:
как просто массив 8ми битных чисел.

почему сразу не двоичная система?
потому что запись была бы длиннее.
и в кучке нуликов и единичек легко ошибиться.

Цитата Сообщение от Verevkin Посмотреть сообщение
16-ричная удобнее.
удобнее, чем что?

Цитата Сообщение от TRam_ Посмотреть сообщение
тогда уже флаги типа
(1<<10) + (1<<5) + (1<<4) + (1<<2) + (1<<0)
нормальные люди примерно так и делают.
в смысле: используют более простую запись вида: 1 << N

операция сложения флагов - это конечно какой то бред.
использовать магические числа - тоже дикость.

цивилизованные люди используют цивилизованные константы:

C++
1
2
3
4
5
6
enum eFLAGS
{
    eFIRST   = 1 << 1,
    eSECOND  = 1 << 2,
    eTHIRD   = 1 << 3,
};
такой способ имеет как минимум два серьёзных преимущества.

1.
сами по себе запись очень легкая при написании:
не нужно думать над фактическим значением флага.

если бы в примере выше использовалась 16-тиричная система,
и нужно было бы добавить ещё один флаг,
пришлось бы думать/высчитывать:
чему равно 1 << 4 в 16-тиричной системе?

а нафига утруждать свой мозг какими то расчетами,
когда можно сразу же тупо так и записать:

C++
1
2
3
4
5
6
7
enum eFLAGS
{
    eFIRST   = 1 << 1,
    eSECOND  = 1 << 2,
    eTHIRD   = 1 << 3,
    eFOURTH  = 1 << 4,
};
при добавлении очередного флага,
знай себе: увеличивай на единичку: 1<<4
и пофиг каким будет итоговое значение константы.

2.
лайф-хак.

вот есть интовая переменная, которая содержит какие то флаги.
и вот втыкаешь ты в отладчике, и что ты видишь?
какую то непонятную циферку.
и тебе совершенно не очевидно: так какие флаги то включены?

а вот если бы ты использовал цивилизованный способ,
как я обрисовал выше, тогда любой цивилизованный отладчик,
показал бы тебе флаги красиво:

Запись констант в шестнадцатеричной системе


фокус в том, что обычный int для отладчика - просто какое то число.
компилятор не телепат.
он понятия не имеет: флаги там, или что.

но отладчики в курсе трюка с enum
ведь все возможные значения enum-констант известны заранее.
поэтому, несложно догадаться,
что переменная типа enum хранит набор флагов.
и красиво отобразить их значения.

так почему же многие люди используют обычные 16тиричные инты,
вместо простых и красивых enum 1<< N ?

а хз.
может просто не раздуплили, что запись вида: 1<< N - проще.
а про лайф-хак с enum просто не знают.
1
Эксперт С++
8426 / 4099 / 894
Регистрация: 15.11.2014
Сообщений: 9,200
24.08.2019, 22:45 28
Цитата Сообщение от Verevkin Посмотреть сообщение
Напиши кусок программы, который:
уж точно не буду в уме вдуплять,
как выглядит голимая 16тиричная фигня в двоичном виде.

когда люди видят маску,
им важно её говорящее имя,
а не значение.

для любителей зажигать лампочки перекладывать биты,
есть православный bitset
0
Продавец времени
5777 / 3186 / 731
Регистрация: 12.03.2015
Сообщений: 15,094
24.08.2019, 23:26 29
Цитата Сообщение от hoggy Посмотреть сообщение
удобнее, чем что?
Чем армяне (© анекдот).
Цитата Сообщение от hoggy Посмотреть сообщение
уж точно не буду в уме вдуплять,
как выглядит голимая 16тиричная фигня в двоичном виде.
Перестань отвечать на вопросы, заданные не тебе.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
24.08.2019, 23:39  [ТС] 30
Цитата Сообщение от hoggy Посмотреть сообщение
для любителей зажигать лампочки перекладывать биты,
есть православный bitset
мне когда-то приходилось иметь дело с битами в С++ и я устанавливал к примеру бит события в 1 чтобы оно не попадало в порт завершения вот так
C++
1
hEvent |= 0x1
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
24.08.2019, 23:54 31
Цитата Сообщение от ReYalp Посмотреть сообщение
мне когда-то приходилось иметь дело с битами в С++ и я устанавливал к примеру бит события в 1 чтобы оно не попадало в порт завершения вот так
ReYalp, всё верно. Для работы с портами железа такие вещи и применяют. Так я же и говорю, - идею 16-ричной записи байта одобрил в одном порту знаменитый финикийский пират. Ему одним глазом было легче читать короткую запись. Кроме всего он был хоть и одноглазый но не тупой и понимал, что 33 это две двоичные тройки: 110011, а учитывая что у байта 8 вёсел то ещё два ведущих нуля нужны: 00110011. В чём тут напряг? А ещё бонус в том, что римляне понимают римский алфавит, но десятичные арабские цифры для них - китайская грамота. А арабы не знают латиницы. То есть, отличная система которую понимают только хакеры пираты.
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
25.08.2019, 00:00  [ТС] 32
IGPIGP, и еще никогда не задумывался что значит 0x в начале?
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
25.08.2019, 00:12 33
Цитата Сообщение от ReYalp Посмотреть сообщение
и еще никогда не задумывался что значит 0x в начале?
Почему? Намекаете на то, что череп с косточками не разглядели когда-то ( 0x ), а теперь, читая мою, чистую как слеза пирата правду, постигли суть происходящего?
1
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
25.08.2019, 00:23  [ТС] 34
IGPIGP, а если серьезно?
0
15104 / 8106 / 1956
Регистрация: 30.01.2014
Сообщений: 13,771
25.08.2019, 00:32 35
ReYalp, x - это от слова heXadecimal - шестнадцатеричный. А 0 в начале - это синтаксический костыль, чтобы можно было продолжать считать такой литерал числом (если мы уберем 0, то получим идентификатор, т.к. он начинается с буквы, по правилам С).
2
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
25.08.2019, 00:44 36
Цитата Сообщение от ReYalp Посмотреть сообщение
IGPIGP, а если серьезно?
Дык, я же серьёзно. Фамилия пирата была Парсер. Он черепушку и придумал. Отсюда - "лысый череп", в известном пиратском приветствии. Это история полная легенд. Например, когда пират понял, что десяти арабских цифр не хватит, он не сразу додумался использовать буквы. Капитан не был математиком и рассуждал так, - ноль он и в Африке ноль, - то есть череп. И нужно ещё 15 знаков. Он рассадил за столом 16 пиратов и одного большого и лысого назначил нулём. От него считали по часовой стрелке (хотя не факт, - может и наоборот). Сразу стала вытанцовываться последовательность из 9 арабских цифр. И ещё шести человек. Так родилась знаменитая формула "15 человек на сундук мертвеца".
Это всё можно считать пруфом, так что я не выдумал ни чего. Может чуть приукрасил только.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
25.08.2019, 00:47  [ТС] 37
IGPIGP, интересно,а у этого пирата был компьютер?
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
25.08.2019, 00:51 38
Цитата Сообщение от ReYalp Посмотреть сообщение
IGPIGP, интересно,а у этого пирата был компьютер?
А как иначе? Сколько пиратов - столько и компьютеров, всегда. Только если учесть, что байт это лодка, то компьютеры были очень большие. А вообще, система счисления не зависит от компьютерного представления.
0
49 / 33 / 9
Регистрация: 27.12.2017
Сообщений: 1,398
25.08.2019, 00:53  [ТС] 39
IGPIGP, а что за ОС у него была?
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4428 / 598
Регистрация: 04.12.2011
Сообщений: 13,270
Записей в блоге: 16
25.08.2019, 01:05 40
Цитата Сообщение от ReYalp Посмотреть сообщение
GPIGP, а что за ОС у него была?
Какая ОС? Всё в инструкциях центрального процессора. А ось - пополам ему была. Он же пират! Ось пополам, кстати, тоже из тех времён.
ReYalp, сейчас придут центурионы и разгонят пиратов по всей архитектуре акватории. Я конечно, погряз в истории, но по сути, запись очень логична. По пол байта каждая 16-ричная цифра. Хотя вопрос дискуссионный, конечно. Можно и в двоичном виде писать. Суть не изменится. Однако, если в порт пишутся (или читаются из) именно связанные комбинации, то с короткими константами проще, наверное. Пираты - люди не привыкшие к долгим и пристальным исследованиям. Они прагматичны и настроены на результат. И если 0x33 даёт именно то, что требуется, то: - "Йо-хо-хо и бутылка рома!".
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2019, 01:05

Запись в бинарный файл в шестнадцатеричной системе
в в шестнадцатеричной системе static void Main(string args) { string aplha...

Запись числа -2047 в шестнадцатеричной системе счисления
Нужно записать FFFFFFFFFFFFF801 с помощью 3 символов. Это возможно вообще?

Вывести запись в виде 4 знаков в шестнадцатеричной системе
напишите программу, используя процедуру, которая выводит на экран запись числа меньшего, чем...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.