битовые операции в с - PullRequest
       1

битовые операции в с

4 голосов
/ 13 января 2010

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

например:

0xabcd -> 0xdcba

0xabcd -> 0xdabc

Ответы [ 4 ]

13 голосов
/ 13 января 2010

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

Некоторые баллы:

  • Не существует такой вещи, как "шестнадцатеричное число". Гекс это просто нотация. Как вы перевернуть и повернуть десятичные числа и вернуть число в C? Например:

    1776 -> 6771

    1776 -> 6771?

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

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

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

1 голос
/ 18 августа 2015

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

2-й - это битовое вращение на 4 бита. См. Рекомендации по операциям кругового сдвига (вращения) в C ++ , где приведены рекомендации по удобному для компилятора поворотам, которые защищают от неопределенного поведения C / C ++.

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


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

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

0 голосов
/ 18 августа 2015

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

#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
0 голосов
/ 13 января 2010

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

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

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

Битовый ИЛИ переставленные битовые комбинации вместе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...