Подкачать два бита с единственной операцией в C?

Если вам нужен вывод команды cmd:

if c, err := exec.Command("cmd","/c","del","a.txt").CombinedOutput(); err != nil {
        log.Fatal(err)
    } else {
        fmt.Printf("%s\n", c)
    }
12
задан starblue 28 January 2013 в 16:53
поделиться

6 ответов

Попробуйте:

x ^= 0x14;

Это переключает оба бита. Это немного неясно, так как вы сначала упоминаете своп, а затем приводите пример переключения. В любом случае, перестановка битов:

x = precomputed_lookup [x];

, где precomputed_lookup - это 256-байтовый массив, может быть самым быстрым способом, это зависит от скорости памяти относительно скорости процессора. В противном случае это:

x = (x & ~0x14) | ((x & 0x10) >> 2) | ((x & 0x04) << 2);

РЕДАКТИРОВАТЬ: Дополнительная информация о переключении битов.

Когда вы xor ( ^ ) два целых значения вместе, xor выполняется на уровне битов, например:

for each (bit in value 1 and value 2)
   result bit = value 1 bit xor value 2 bit

, так что бит 0 первого значения xor'ed с битом 0 второго значения, бит 1 с битом 1 и так далее. Операция xor не влияет на другие биты значения. По сути, это параллельный бит xor на многих битах.

Глядя на таблицу истинности для xor, вы увидите, что xor'ing немного со значением '1' фактически переключает бит.

 a  b a^b
 0  0  0
 0  1  1
 1  0  1
 1  1  0

Итак, toggle биты 1 и 3, запишите двоичное число с единицей, где вы хотите переключить бит, и с нулем, где вы хотите оставить значение неизменным:

00001010

преобразовать в шестнадцатеричный: 0x0a. Вы можете переключать столько битов, сколько хотите:

0x39 = 00111001

переключит биты 0, 3, 4 и 5

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

Глядя на таблицу истинности для xor, вы увидите, что xor'ing немного со значением '1' фактически переключает бит.

 a  b a^b
 0  0  0
 0  1  1
 1  0  1
 1  1  0

Итак, toggle биты 1 и 3, запишите двоичное число с единицей, где вы хотите переключить бит, и с нулем, где вы хотите оставить значение неизменным:

00001010

преобразовать в шестнадцатеричный: 0x0a. Вы можете переключать столько битов, сколько хотите:

0x39 = 00111001

переключит биты 0, 3, 4 и 5

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

Глядя на таблицу истинности для xor, вы увидите, что xor'ing немного со значением '1' фактически переключает бит.

 a  b a^b
 0  0  0
 0  1  1
 1  0  1
 1  1  0

Итак, toggle биты 1 и 3, запишите двоичное число с единицей, где вы хотите переключить бит, и с нулем, где вы хотите оставить значение неизменным:

00001010

преобразовать в шестнадцатеричный: 0x0a. Вы можете переключать столько битов, сколько хотите:

0x39 = 00111001

переключит биты 0, 3, 4 и 5

00001010

преобразовать в шестнадцатеричный: 0x0a. Вы можете переключать столько битов, сколько хотите:

0x39 = 00111001

переключит биты 0, 3, 4 и 5

00001010

преобразовать в шестнадцатеричный: 0x0a. Вы можете переключать столько битов, сколько хотите:

0x39 = 00111001

переключит биты 0, 3, 4 и 5

30
ответ дан 2 December 2019 в 03:06
поделиться

Вы не можете "поменять местами" два бита (т. Е. Биты меняют местами, а не значение) в одной инструкции, используя битовую перестановку.

Оптимальный подход, если вы действительно хотите поменять местами их вероятно таблица поиска. Это верно для многих «неудобных» преобразований.

BYTE lookup[256] = {/* left this to your imagination */};

for (/*all my data values */) 
  newValue = lookup[oldValue];
11
ответ дан 2 December 2019 в 03:06
поделиться

Следующий метод НЕ является отдельной инструкцией C, это просто еще один метод перебора битов. Метод был упрощен из Замена отдельных битов с помощью XOR .

Как указано в Ответе Родди , лучше всего подойдет таблица поиска. Я предлагаю это только в том случае, если вы не хотите его использовать. Это действительно также поменяет биты, а не только переключение (то есть все, что находится в бите 2, будет в 4, и наоборот).

  • b: ваше исходное значение - ??? 1? 0 ?? например
  • x: просто временная
  • r: результат

    x = ((b >> 2) ^ (b >> 4)) & 0x01
    r = b ^ ((x << 2) | (x << 4))

Краткое объяснение: получите два бита, которые вы хотите просмотреть, и выполните XOR, сохраните значение в x . Сдвигая это значение обратно на биты 2 и 4 (и выполняя операцию ИЛИ), вы получаете маску, которая при обратном выполнении операции XOR с b поменяет местами ваши два исходных бита. В приведенной ниже таблице показаны все возможные случаи.

bit2: 0 1 0 1  
bit4: 0 0 1 1  
x   : 0 1 1 0   <-- Low bit of x only in this case 
r2  : 0 0 1 1  
r4  : 0 1 0 1

Я не проверял это полностью, но в нескольких случаях, которые я попробовал быстро, казалось, что это сработало.

5
ответ дан 2 December 2019 в 03:06
поделиться

Надеюсь, это поможет. Уловка состоит в том, чтобы использовать абсолютное позиционирование и настроить верхний и левый столбцы. Конечно, «мертвая точка» будет зависеть от размера встраиваемого объекта / div, поэтому вам нужно будет поработать. Для окна входа в систему я использовал следующее - оно также имеет некоторую безопасность с max-width и max-height, которые могут быть вам полезны в вашем примере. Настройте значения ниже в соответствии с вашими требованиями.

2
ответ дан 2 December 2019 в 03:06
поделиться

This might not be optimized, but it should work:

unsigned char bit_swap(unsigned char n, unsigned char pos1, unsigned char pos2)
{
    unsigned char mask1 = 0x01 << pos1;
    unsigned char mask2 = 0x01 << pos2;
   if ( !((n & mask1) != (n & mask2)) )
        n ^= (mask1 | mask2);
    return n;
}
4
ответ дан 2 December 2019 в 03:06
поделиться

Сказать, что ваша ценность X I.E, x = ??? 1? 0 ??

Два бита могут быть переключены на эту операцию:

x = x ^ ((1<<2) | (1<<4));
0
ответ дан 2 December 2019 в 03:06
поделиться
Другие вопросы по тегам:

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