Как записать шестнадцатеричное число в c
Перейти к содержимому

Как записать шестнадцатеричное число в c

  • автор:

Шестнадцатеричные числа в Си

Передо мной стоит задача реализовать алгоритм SEAL2.0. Если вкратце, то на вход из файла подается 160 символьное слово, оно делится на 5 чисел шестнадцатеричной системы счисления по 32 символа. Далее происходят разные манипуляции с этими шестнадцатеричными числами: циклический сдвиг, побитовое логическое умножение, побитовое логическое сложение и т.д. Я знаю, что Си поддерживает побитовые операции, шестнадцатеричные числа и может работать с ними. То есть можно сделать так:

char a,b,c; a=0x2f; b=0x1c; c=a&b;// поразрядное "И" 

Вопрос, можно ли как то использовать встроенные побитовые операции для больших шестнадцатеричных чисел в 32 знака? В каком формате тогда хранить такие большие числа, что бы с ними можно было работать?

Отслеживать
9,456 4 4 золотых знака 42 42 серебряных знака 57 57 бронзовых знаков
задан 10 янв 2015 в 15:04
kripiotkoo kripiotkoo
95 1 1 золотой знак 1 1 серебряный знак 3 3 бронзовых знака
что вам мешает применять битовые операции к любым другим целочисленным типам помимо char?
10 янв 2015 в 15:07

А какие целочисленные типы могут «вместить» 32 значное шестнадцатеричнное число? long int даже слишком мал.

10 янв 2015 в 15:29
Что такое «32 значное шестнадцатеричнное число»?
10 янв 2015 в 15:49
10 янв 2015 в 15:53

@kripiotkoo вы точно понимаете разницу между 16-ричной и двоичной системами счисления? То число, что вы привели — это по всей вероятности 32-разрядное двоичное число, которое может быть записано в обычную 4-байтовую переменную (обыкновенный long int обычно). В чем проблема использовать соответствующий тип данных?

Битовые операции в языке Си. Восьмеричные и шестнадцатеричные числа

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

В языке программирования 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.

Шестнадцатеричное число 7D в двоичной системе счисления будет выглядеть как 0111 1101.

Если бы мы при работе с поразрядными операциями использовали десятичные числа, то чтобы оценить результат нам бы каждый раз приходилось переводить десятичное число в двоичную систему счисления, что относительно трудоемко. Если же человек видит, например, восьмеричное число, то он может представить как оно выглядит в двоичном представлении, помня или держа перед глазами таблицу соответствия чисел. Например, как только мы видим 017, то можем представить в уме, как последние четыре бита ячейки памяти забиты единицами.

Теперь вернемся к поразрядным операциям и посмотрим как работает каждая из них. Для этого напишем небольшую программу:

int a, b; a = 017; b = 036; printf("0%o & 0%o = 0%o\n", a, b, a & b); printf("0%o | 0%o = 0%o\n", a, b, a | b); printf("0%o ^ 0%o = 0%o\n", a, b, a ^ b); printf("0%o \n", a, a  2); printf("0%o >> 2 = 0%o\n", a, a >> 2); printf("~0%o = 0%o\n", a, ~a);

Результат ее работы будет выглядеть так:

017 & 036 = 016 017 | 036 = 037 017 ^ 036 = 021 017 > 2 = 03 ~017 = 037777777760

Этот результат будет проще понять с помощью рисунка:

Результат побитовых операций

В последнем случае получилось такое большое число потому, что под форматы вывода целых чисел ( %d , %o , %X ) выделяется по 4 байта.

Теперь рассмотрим пример использования битовых операций. Допустим, у нас есть массив, требуется снять с него «маску», которая бы отражала, в какой позиции стоят отрицательные, а в какой положительные элементы. Пусть единица в бите обозначает соответствующий ей положительный элемент массива, а ноль — отрицательный. Так «битовая маска» массива будет выглядеть как 101110, или в восьмеричном представлении как 056. Составим алгоритм решения этой задачи:

  1. Будем считать, что массив состоит не более чем из 32 элементов. Поэтому для хранения его «маски» достаточно переменной типа int . Назовем ее mask и присвоим значение 0.
  2. Переберем элементы массива в цикле for . Если встречается положительный элемент, то установим соответствующий ему бит значения mask в 1.
  3. Выведем значение переменной mask на экран в виде восьмеричного числа.

Вроде бы все просто, но как установить в единицу определенный бит числа? Существует закономерность соответствия степеней двойки и двоичного представления числа:
2 0 = 0000 0001
2 1 = 0000 0010
2 2 = 0000 0100
2 3 = 0000 1000
2 4 = 0001 0000
и т.д. Теперь если применить к mask побитовую операцию | (ИЛИ), а в качестве второго операнда использовать определенную степень двойки, то один бит будет установлен в 1. Например:
(0) 0000 0000 | (2 5 ) 0010 0000 = 0010 0000
(32) 0010 0000 | (2 7 ) 1000 0000 = 1010 0000

При переборе первый элемент массива имеет индекс 0, но соответствующий ему бит в maskдолжен стоять впереди остальных. Если известно общее количество элементов массива (N), то можно определить степень двойки по формуле N — i — 1 . Так, имея четвертый положительный элемент массива (его индекс 3) из 10 элементов, следует установить в единицу седьмой с конца бит (он же будет четвертым с начала), а это значит надо использовать вторым операндом битового ИЛИ 2 6 , а 6 как раз будет 10( N ) — 3( i ) — 1.

Другая проблема — как в языке C возвести число в степень. Понятно, что можно написать свой код, но скорее всего в стандартной библиотеке уже есть подобная функция. С помощью заголовочного файла math.h можно подключить библиотеку с математическими функциями. Среди них есть функция pow() , которая принимает два числа и возвращает результат возведения первого числа в степень, выраженную вторым числом. Однако результат возвращается в виде вещественного числа, а нам требуется целое. Как быть? В Си есть операции приведения типов, которые меняют тип значения с одного на другой. Например, чтобы преобразовать значение вещественной переменной a в целое, следует написать (int) a .

Вот как может выглядеть вышеописанная программа:

#include #include #define N 12 int main() { int nums[N] = {7, 3, 9, -5, -3, 2, 1, 0, 16, -4, 2, 0}; int mask = 0; for (int i = 0; i  N; i++) if (nums[i] >= 0) mask = mask | (int) pow(2, N-i-1); printf("%o\n", mask); }

Если у вас не получается скомпилировать программу, добавьте в конце вызова gcc опцию -lm (например, gcc -o bits bits.c -lm ).

Курс с решением задач:
pdf-версия

Как в моём классе реализовать перевод из шестнадцатеричной системы счисления в восьмеричную?

Здравствуйте. Я создал класс, в котором изначально введена шестнадцатеричная строка. Так же введена ещё одна строка. И мы проверяем, если строки равны, то выводим 1, если нет, то 0. Затем складываем эти строки и выводим их длину. И нужно перевести эти строки в восьмеричную систему. Последнее у меня и не выходит. Это можно сделать как через наследование так и нет. В СИ знаю, что можно перевести так:
int n;
cout scanf(«%x», &n);
printf(«%s %o», «Восьмеричное равно «, n);
Сделать, чтобы это всё работает, не выходит. Подскажите, пожалуйста, как это реализовать.
Вот мой код. Преподаватель сказал, что исправлять ничего не нужно. Только сделать перевод.

#pragma once #include #include using namespace std; class String < protected: int Length; char* Str; public: String(); String(const char* ptr); String(const String& t); String& operator = (String& t); String& operator += (const String& t); bool operator == (const String& t) const; bool operator != (const String& t) const; bool is_empty() const; const char* getStr() const; int getLength() const; ostream & show(ostream & os) const; friend ostream & operator ~String(); >;
#include "String.h" #include #include using namespace std; String::String() < Str = 0; Length = 0; >String::String(const char* ptr) : Length(strlen(ptr)), Str(new char[Length + 1]) < strcpy(Str, ptr); >String::String(const String& t) : Length(strlen(t.Str)), Str(new char[Length + 1]) < strcpy(Str, t.Str); >String& String::operator = (String& t) < swap(Length, t.Length); swap(Str, t.Str); return *this; >String& String::operator += (const String& t) < int newLength = Length + t.Length; char *newStr = new char[newLength + 1]; strcpy(newStr, Str); strcat(newStr, t.Str); delete[] Str; Str = newStr; Length = newLength; return *this; >bool String::operator == (const String& t) const < return Length == t.Length && strcmp(Str, t.Str) == 0; >bool String::operator != (const String& t) const < return !(operator == (t)); >bool String::is_empty() const < return Str == 0 || Str[0] == '\0'; >const char* String::getStr() const < return Str; >int String::getLength() const < return Length; >ostream & String::show(ostream & os) const < return os String::~String()
#include "String.h" #include #include #include using namespace std; int main()
  • Вопрос задан более трёх лет назад
  • 517 просмотров

Как перевести шестнадцатеричное число в char?

Author24 — интернет-сервис помощи студентам

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

Перевести дробное шестнадцатеричное число в двоичное
В общем, нужно перевести дробное шестнадцатеричное число в двоичное. Пробовал это.

Перевести шестнадцатеричное число из его представления в формате float в десятичный вид
Перевести шестнадцатеричное число 8027B2A6 из его представления в формате float в десятичный вид. И.

Как перевести число из char в int?
Написал программу, которая делает проверку на ввод чисел (проверял каждый символ, чтобы не прошла.

132 / 158 / 87
Регистрация: 06.04.2016
Сообщений: 992
А зачем переводить, шестнадцатеричное число и есть char.
Регистрация: 18.07.2015
Сообщений: 76
Нужно вывести его в Static Text.
829 / 253 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
Еще лучше. Может всё-таки объясните нормально что Вам нужно?
Регистрация: 18.07.2015
Сообщений: 76
Проблема решена.
sprintf(str, "%X", List_Plugin);
2666 / 2241 / 240
Регистрация: 03.07.2012
Сообщений: 8,145
Записей в блоге: 1
Не совсем решена - проблема в том, что вы путаете char и char* (или char[])
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

MFC как перевести в шестнадцатеричное представление?
Надо чтобы выводилось значение в шестнадцатеричном виде inf = (unsigned char(Info.readbuf)); .

Как найти в строке шестнадцатеричное число?
Упакованная строка, содержащая символьное представление шестнадцатеричных чисел. //Все символы.

Как преобразовать шестнадцатеричное число в строку?
как записать в строку шестнадцатеричное число? например 111111111 в основании 16 в строке должно.

Как получить шестнадцатеричное число из строки
Привет. В переменной типа String записано, в одном из форматов, шестнадцатеричное число.

Или воспользуйтесь поиском по форуму:

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

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