как вы можете повернуть и повернуть шестнадцатеричные числа и вернуть число на C с побитовыми операторами?битовые операции в c
, например:
0xabcd -> 0xdcba
0xabcd -> 0xdabc
как вы можете повернуть и повернуть шестнадцатеричные числа и вернуть число на C с побитовыми операторами?битовые операции в c
, например:
0xabcd -> 0xdcba
0xabcd -> 0xdabc
Это трудно знать, где начать с этим вопросом. Плюс я чувствую домашнюю работу.
Некоторые моменты:
Там нет такого понятия, как "шестнадцатеричное число". Hex - это всего лишь обозначение. Как вы поворачиваете и поворачиваете десятичные числа и возвращаете число в C? Например:
1776 -> 6771
1776 -> 6771?
Для решения этой проблемы необходимо глубокое понимание позиционной нотации, будь то основание 10, основание 16, основание 2 или что у вас есть.
Все, что вам нужно, - это добавление, вычитание, умножение и деление. Эти являются операциями по номерам. Модуль также очень полезен.
Если вам посчастливилось умножить или разделить на две силы, я рекомендую вам сдвиг влево <<
и правую смену >>
операторов. Они отлично работают для чисел, которые представлены с использованием типов C unsigned
или unsigned long
.
+1 для объяснения (соответствующим образом поверхностным образом) различия между * числом * и его обозначением в конкретной * базе *. –
Действительно? Меня раздражает, когда люди предполагают, что вы не знаете определения. Просто потому, что вы использовали слово, которое семантически неправильно, не означает, что вы не знаете, что это такое. – Louis
@ Луис: Я не думаю, что Норман подразумевает, что он не знает, что это такое, я думаю, он пытается сделать это различие более ясным. Тот факт, что «10» в десятичном формате «А» в шестнадцатеричном формате, но они являются ТОЛЬКО, и поэтому «переключение» числа 123 в шестнадцатеричном формате будет представлять собой математически разную операцию, чем переключение 123 в десятичной системе, не сразу становится очевидным для большинства люди. –
Чтобы поменять номер с помощью битовых операций:
Выполните побитовую операцию, используя оригинальный номер с соответствующей маской для извлечения шестнадцатеричного кода (4 бита) от исходного числа.
Сдвиньте этот извлеченный битовый узор в новое место.
Побитовое ИЛИ перемещенные битовые шаблоны вместе.
Надеюсь, это поможет.
Шестнадцатеричные числа - это цифры, как указывает ответ Нормана. Тем не менее, 1 шестнадцатеричная цифра = 4 бита, поэтому эти операции действительно имеют смысл как вещи, которые вы, возможно, захотите сделать с целыми значениями.
Второй побитовый поворот на 4 бита. См. Best practices for circular shift (rotate) operations in C++ для получения наилучших практических рекомендаций для дружественных к компиляторам вращений, которые защищают от неопределенного поведения C/C++.
Если ваш вход не 8, 16, 32 или 64 бита, вам может потребоваться сдвинуть + маску вручную, вместо того чтобы полагаться на сдвиг в ноль.
Первый требует большего количества кода: он меняет порядок кусков. Для этого нет машинной инструкции или простой способ построить ее из нескольких поразрядных операций всего целого числа сразу.
Я думаю, вам придется отменить порядок байтов, а затем изменить порядок кусков в каждом байте (8-битный поворот на 4).
Для удовольствия следует в рекурсивном решении, которое работает для любой ширины цифр.
#include <limits.h>
unsigned ReverseHex(unsigned x, unsigned DigitWidth) {
if (DigitWidth <= 1) {
return x;
}
unsigned SideDigitWidth = DigitWidth/2;
unsigned SideBitWidth = SideDigitWidth * 4;
unsigned CenterAndRightDigitWidth = DigitWidth - SideDigitWidth;
unsigned CenterAndRightBitWidth = CenterAndRightDigitWidth * 4;
unsigned CenterAndRight = x & ((1u << CenterAndRightBitWidth) - 1);
unsigned Right = x & ((1u << SideBitWidth) - 1);
unsigned Center = CenterAndRight - Right;
return ReverseHex(x >> CenterAndRightBitWidth, SideDigitWidth) + Center
+ (ReverseHex(Right, SideDigitWidth) << CenterAndRightBitWidth);
}
int main(void) {
printf("%X\n", ReverseHex(0x1234, 4));
printf("%X\n", ReverseHex(0x12345, 5));
printf("%X\n", ReverseHex(0x1234567, 7));
printf("%X\n", ReverseHex(0x12345678, 8));
return 0;
}
Выход
4321
54321
7654321
87654321
2-я один поворот побитовое на 4 бита. См. Http://stackoverflow.com/questions/776508/best-practices-for-circular-shift-rotate-operations-in-c для лучших практик для дружественных к компиляторам вращений, которые защищают от неопределенного поведения. –