Перемещение и переключение бит - PullRequest
0 голосов
/ 22 января 2019

Мне нужно преобразовать входное число с помощью битовых манипуляций.Вот правила:

  • бит 0 должен быть 1;
  • бит 1 должен быть перевернутым битом 2 ввода;
  • бит 2 должен быть битом 1ввода;
  • бит 3 должен быть перевернутым битом ввода 0.

Вот таблица перевода:

Input  Input (bin)  Output  Output (bin)
0      0000         11      1011
1      0001         3       0011
2      0010         15      1111
3      0011         7       0111
4      0100         9       1001
5      0101         1       0001
6      0110         13      1101
................................

Вот что я пробовал:

def tr(n):
    return ((n & 1 ^ 1) << 1) | ((n >> 1 & 1) << 2) | \
    ((n >> 2 & 1 ^ 1) << 3) | 1

tr(0) дает правильное число: 11, но tr(1) дает мне 9. Я сижу здесь в течение 3 часов с головной болью и не могу понять, что не так.Извините, если это что-то тривиальное или здесь какая-то глупая ошибка.Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Ниже приводится соответствующий результат вашей таблицы перевода:

def tr(n):
    return 1 | ((n&4)>>1) ^ 2 | (n&2) << 1 | ((n&1) << 3) ^ 8

Для лучшего понимания:

  1. бит 0 должен быть 1 -> 1

  2. бит 1 должен быть перевернутым битом 2 входа.Сначала выберите бит 2: n&4, затем переместите его с бита 2 на бит 1: (n&4)>>1 и, наконец, измените значение бита 1 (2 ** 1 = 2): ((n&4)>>1) ^ 2.

  3. бит 2 должен быть битом 1 ввода.Сначала выберите бит 1: n&1, затем переместите его из бита 1 в бит 2: (n&2) << 1

  4. бит 3 должен быть перевернутым битом 0 ввода.Сначала выберите бит 0: n&1, затем переместите его с бита 0 на бит 3: (n&1) << 3 и, наконец, измените значение бита 3 (2 ** 3 = 8): ((n&1) << 3) ^ 8

0 голосов
/ 22 января 2019

Согласно вашим спецификациям

бит 1 должен быть перевернутым битом 2 ввода;

бит 2 должен быть битом 1 ввода;

бит 3 должен быть перевернутым битом 0 ввода.

ваш код должен быть

def tr(n):
  return (((n & 4) ^ 4) >> 1) | ((n & 2) << 1) |
  ((n & 1 ^ 1) << 3) | 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...