2013-10-09 3 views
0

У меня есть код, который меняет два набора шестнадцатеричных чисел, а затем сохраняет их в новый символ unsigned. Код выглядит следующим образом:Логика битового маскирования XOR-кода

unsigned char OldSw = 0x1D; 
unsigned char NewSw = 0xF0; 
unsgined char ChangedSw; 

ChangedSw = (OldSw^~NewSw) & ~OldSw; 

Так что я знаю:

0x1D = 0001 1101

0xF0 = 1111 0000

Im замешательстве от того, что делает линию changedSw. Я знаю, что это даст выход 0x02, но я не могу понять, как это делается.

+1

Выполняйте операции, один за другим, на бумаге. Сначала сделайте инверсию «NewSw», затем XOR, затем инверсию «OldSw» и, наконец, AND. Тогда вы точно узнаете, что происходит и почему. –

+0

Итак, NewSw станет 0000 1111 после правильной инверсии? Тогда XOR приведет его к 0x0D. Тогда я бы И что с инвертированным oldSw? – user081608

+0

Да, вот что происходит. –

ответ

0

ChangedSw = (OldSw^~NewSw) & ~OldSw;

Это означает "ноль одна часть OldSw и обратная другая часть". NewSw указывает, какие биты OldSw равны нулю и какие биты инвертируются. А именно, 1's в NewSw указывают биты, которые должны быть обнулены, 0 указывают, что биты должны быть инвертированы.

Эта операция выполнена в два этапа.

Шаг 1. Инвертировать биты.

(OldSw^~NewSw):

0001 1101 
^ 0000 1111 
    --------- 
    0001 0010 

Престол, мы перевернутые биты, которые были 0 'в оригинальном NewSw.

Шаг 2. Нулевые биты, которые не были инвертированы на предыдущем шаге.

& ~OldSw:

0001 0010 
& 1110 0010 
    --------- 
    0000 0010 

Престола, это не меняет перевернутые биты, но ноль все остальное.

+0

'& ~ OldSw' нули биты, которые равны нулю в oldSW, а не биты, которые не были инвертированы на предыдущем шаге. Также * «1 в NewSw указывает, что бит должен быть обнулен» * вводит в заблуждение. –

+0

@MartinR "нули биты, которые равны нулю в oldSW" - что это значит? Бит 1 равен нулю в OldSw, но результат равен 0x02. См., Бит 1 не равен нулю. Как его можно обнулить? – kotlomoy

+0

Извините, я понял, что это не так.'& ~ OldSw' нулевает биты, которые * one * в OldSW. Моя точка зрения заключалась только в том, что этот шаг не зависит от NewSw и не зависит от предыдущего шага. –

-1

первая часть будет 1F ie. 0001 1111.So когда закончился ~ oldsw (1110 0010) операция будет что-то вроде этого:

 
0001 1111 
1110 0010 
---------- 
0000 0010 

Так выход будет 2. Тильды оператор 1 дополнение.

+0

Как вы получили 1F? – user081608

+3

Ответ неверен. Промежуточный шаг, то есть «OldSw^NewSw», не является «0x1F». Это должно быть '0001 0010' или' 0x12' – Pankrates

Смежные вопросы