обмен битами с типом символа в C - PullRequest
1 голос
/ 12 октября 2010

тип данных - char, и шаблон следующий:

байт источника: [0] [1] [2] [3] [4] [5] [6] [7]

пункт назначения: [6] [7] [4] [5] [2] [3] [0] [1]

например, если я передам char, 29 этой функции,он выполнит обмен и возвратит значение типа char, равное 116.

Как я могу выполнить обмен?

спасибо.

========================

Просто интересно, смогу ли я так поступить?

unsigned char mask = 128;
char num = 0, value1 = 29;
int i, a;

for(i = 0; i < 8; i++) {
  if (i == 0 || i == 1 || i == 6 || i == 7)
    a = 6;
  else
    a = 2;

  if(i < 4)
    num = ((value1 & mask) >> a);
  else
    num = ((value1 & mask) << a);

  result = (result | num);

  if(i<7)
    mask = mask >> 1;
}

Ответы [ 7 ]

5 голосов
/ 12 октября 2010

Я обычно нумерую свои биты другим способом, так что бит 0 - это младший бит. По вашей схеме нумерации:

unsigned char src = 29;
unsigned char dst = 0;
dst = (((src & 0x80) >> 6) | // bit 0
       ((src & 0x40) >> 6) | // bit 1
       ((src & 0x20) >> 2) | // bit 2
       ((src & 0x10) >> 2) | // bit 3
       ((src & 0x08) << 2) | // bit 4
       ((src & 0x04) << 2) | // bit 5
       ((src & 0x02) << 6) | // bit 6
       ((src & 0x01) << 6) // bit 7
      );

Если, конечно, вы нумеруете их "правильным способом", но рисуете их "назад" - тогда просто измените то, что я сделал выше. (Не то чтобы я пытался начать религиозную войну здесь ...)

4 голосов
/ 12 октября 2010

или справочная таблица

на тот случай, если вы этого не понимаете.Вот более подробно

Для каждого из 256 возможных входов отработать ответ (от руки)

, затем сделать

unsigned char answers[256] = {0x00, 0x40,0x21.....};
unsigned char answer = answers[input];

Спешу добавить, что значения Iдал пример - и, конечно, не правильно

3 голосов
/ 12 октября 2010

См. Раздел « Реверсивные битовые последовательности » в Взлом битовых комбинаций .

Также, если вы хотите сделать это самостоятельно:

Чтобы прочитать n -й бит: int bit = value & (1 << n); Если бит не установлен, bit равен 0.

Чтобы установить n -й бит:value |= 1 << n; (значение = значение ИЛИ (1 смещено на n цифр))

Чтобы очистить n -й бит: value &= ~(1 << n); (значение = значение И НЕ (1 смещено на nцифры))

1 голос
/ 12 октября 2010

Сначала поменяйте местами младшие четыре бита с старшими четырьмя битами, затем поменяйте местами все смежные пары битов:

dst = src;
dst = ((dst & 0xF0) >> 4) | ((dst & 0x0F) << 4);
dst = ((dst & 0xCC) >> 2) | ((dst & 0x33) << 2);
0 голосов
/ 12 октября 2010
source byte: [01][23][45][67] to
destination: [67][45][23][01]

Реализация:

unsigned char shiftit( unsigned char in ) {
  unsigned char out;

  out = (
    (( in & 0xC0 ) >> 6) + /* top 2 to bottom 2 */
    (( in & 0x30 ) >> 2) + /* centre-left 2 to centre-right */
    (( in & 0x0C ) << 2) + /* centre-right 2 to centre-left */
    (( in & 0x03 ) << 6)   /* bottom 2 to top 2 */
  );

  return( out );
}

Возвращает 116 при вызове shiftit( 29 ).

0 голосов
/ 12 октября 2010

Поворот через перенос http://en.wikipedia.org/wiki/Bitwise_operation#Rotate_through_carry

Так что это будет работать:

myByte = myByte << 2 | myByte >> 6;
0 голосов
/ 12 октября 2010

Вы можете найти это полезным:

http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious

, но это не совсем то, что вам нужно. Всего лишь немного поработав, вы можете изменить «очевидный» алгоритм, чтобы делать то, что вы хотите.

...