Биты подкачки в числе в C [дубликат]

Я решил ту же проблему путем именования таблицы "Employee" (на самом деле "Сотрудники"). Я пытаюсь остаться подальше от любого конфликта с возможно зарезервированными словами. Даже "Пользователи" неприятно близки для меня.

10
задан GManNickG 28 July 2009 в 07:55
поделиться

11 ответов

Если вы не видели и не делали много битового тиддлинга, хороший ресурс для изучения:

15
ответ дан 3 December 2019 в 14:00
поделиться

My навыки в этой области являются новыми и поэтому недоказанными, поэтому, если я ошибаюсь, я узнаю что-то новое, что, по крайней мере, является частью точки переполнения стека.

Будет ли работать битовая маска и XOR?

Вот так ?

var orginal=
var mask =00001110 //I may have the mask wrong
var value=1011 1110
var result=value^mask;

Возможно, я чего-то не понимаю, простите меня, если я облажался.

-1
ответ дан 3 December 2019 в 14:00
поделиться

Вы ищете что-то более умное, чем стандартный битовый сдвиг?

(при условии, что a - 8-битный тип)

a = ((a >> 4) & 0xF)  + ((a << 4) &0xF0)
1
ответ дан 3 December 2019 в 14:00
поделиться
unsigned char b;
b = (b << 4) | (b >> 4);
2
ответ дан 3 December 2019 в 14:00
поделиться

Псевдокод, подобный C ++ (можно легко переписать, чтобы не использовать временные переменные):

int firstPart = source & 0xF;
int offsetToHigherPart = sizeof( source ) * CHAR_BIT - 4;
int secondPart = ( source >> offsetToHigherPart ) & 0xF;
int maskToSeparateMiddle = -1 & ( ~0xF ) & ( ~( 0xF << offsetToHigherPart );
int result = ( firstPart << offsetToHigherPart ) | secondPart | (source & maskToSeparateMiddle);

Это потребует определения CHAR_BIT. Обычно он находится в limits.h и определяется как 8 бит, но, строго говоря, зависит от платформы и может вообще не определяться в заголовках.

2
ответ дан 3 December 2019 в 14:00
поделиться

Временная переменная не нужна, что-то вроде этого должно с этим работать:

x = ((x & 0xf) << 4) | ((x & 0xf0) >> 4);

В зависимости от точного типа x существует потенциальная ловушка. Выявление этой проблемы предоставляется читателю в качестве упражнения.

2
ответ дан 3 December 2019 в 14:00
поделиться

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


Обновление: Давайте добавим код, а затем вы сможете выбрать, что более читабельно.

Рабочий один лайнер

unsigned int data = 0x7654;
data = (data ^ data & 0xff) | ((data & 0xf) << 4) | ((data & 0xf0) >> 4);
printf("data %x \n", data);

тот же код, но с некоторыми tmp-переменными

unsigned int data = 0x7654;

unsigned int tmp1 = 0;
unsigned int tmp2 = 0;

tmp1 = (0x0f&data)<<4;
tmp2 = (0xf0&data)>>4;
tmp1 = tmp1 | tmp2;

data = data ^ (data & 0xff); 

data = data | tmp1;

printf("data %x \n", data);

Ну, в любом случае, один лайнер короче :)


Обновление:

И если вы посмотрите на asm-код, который gcc сгенерировал с помощью -Os -S, я предполагаю, что они более или менее идентичны, поскольку накладные расходы удаляются во время части «оптимизации компилятора».

3
ответ дан 3 December 2019 в 14:00
поделиться
unsigned char c;

c = ((c & 0xf0) >> 4) | ((c & 0x0f) << 4);
8
ответ дан 3 December 2019 в 14:00
поделиться

сборка x86:

asm{
  mov AL, 10111110b
  rol AL
  rol AL
  rol AL
  rol AL
}

http://www.geocities.com/SiliconValley/Park/3230/x86asm/asml1005.html

1
ответ дан 3 December 2019 в 14:00
поделиться

На этот вопрос интервью нет "правильного ответа". Есть несколько способов сделать это (таблицы подстановки, кто угодно?) И компромиссы между каждым из них (читаемость vs. производительность, переносимость и ремонтопригодность) необходимо будет обсудить.

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

6
ответ дан 3 December 2019 в 14:00
поделиться

Самый простой (t без знака):

t = (t>>4)|(t<<4);

Но если вы хотите скрыть свой код или поменять местами другую комбинацию битов, вы можете использовать эту базу:

mask = 0x0F & (t ^ (t >> 4));
t ^= (mask | (mask << 4));
0
ответ дан 3 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: