2010-01-13 5 views
4

как вы можете повернуть и повернуть шестнадцатеричные числа и вернуть число на C с побитовыми операторами?битовые операции в c

, например:

0xabcd -> 0xdcba 

0xabcd -> 0xdabc 
+0

2-я один поворот побитовое на 4 бита. См. Http://stackoverflow.com/questions/776508/best-practices-for-circular-shift-rotate-operations-in-c для лучших практик для дружественных к компиляторам вращений, которые защищают от неопределенного поведения. –

ответ

13

Это трудно знать, где начать с этим вопросом. Плюс я чувствую домашнюю работу.

Некоторые моменты:

  • Там нет такого понятия, как "шестнадцатеричное число". Hex - это всего лишь обозначение. Как вы поворачиваете и поворачиваете десятичные числа и возвращаете число в C? Например:

    1776 -> 6771

    1776 -> 6771?

  • Для решения этой проблемы необходимо глубокое понимание позиционной нотации, будь то основание 10, основание 16, основание 2 или что у вас есть.

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

  • Если вам посчастливилось умножить или разделить на две силы, я рекомендую вам сдвиг влево << и правую смену >> операторов. Они отлично работают для чисел, которые представлены с использованием типов C unsigned или unsigned long.

+6

+1 для объяснения (соответствующим образом поверхностным образом) различия между * числом * и его обозначением в конкретной * базе *. –

+0

Действительно? Меня раздражает, когда люди предполагают, что вы не знаете определения. Просто потому, что вы использовали слово, которое семантически неправильно, не означает, что вы не знаете, что это такое. – Louis

+0

@ Луис: Я не думаю, что Норман подразумевает, что он не знает, что это такое, я думаю, он пытается сделать это различие более ясным. Тот факт, что «10» в десятичном формате «А» в шестнадцатеричном формате, но они являются ТОЛЬКО, и поэтому «переключение» числа 123 в шестнадцатеричном формате будет представлять собой математически разную операцию, чем переключение 123 в десятичной системе, не сразу становится очевидным для большинства люди. –

-1

Чтобы поменять номер с помощью битовых операций:

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

Сдвиньте этот извлеченный битовый узор в новое место.

Побитовое ИЛИ перемещенные битовые шаблоны вместе.

Надеюсь, это поможет.

1

Шестнадцатеричные числа - это цифры, как указывает ответ Нормана. Тем не менее, 1 шестнадцатеричная цифра = 4 бита, поэтому эти операции действительно имеют смысл как вещи, которые вы, возможно, захотите сделать с целыми значениями.

Второй побитовый поворот на 4 бита. См. Best practices for circular shift (rotate) operations in C++ для получения наилучших практических рекомендаций для дружественных к компиляторам вращений, которые защищают от неопределенного поведения C/C++.

Если ваш вход не 8, 16, 32 или 64 бита, вам может потребоваться сдвинуть + маску вручную, вместо того чтобы полагаться на сдвиг в ноль.

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

Я думаю, вам придется отменить порядок байтов, а затем изменить порядок кусков в каждом байте (8-битный поворот на 4).

0

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

#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 
Смежные вопросы