этот метод избегает использования условных выражений F(N)=(N&((N&1)-1))|((N&1)^((N&3)>>1)
F(N)= (N&(b0-1)) | (b0^b1)
Если вы посмотрите на XOR первых нескольких чисел, которые вы получите:
N | F(N)
------+------
0001 | 0001
0010 | 0011
0011 | 0000
0100 | 0100
0101 | 0001
0110 | 0111
0111 | 0000
1000 | 1000
1001 | 0001
Надеюсь, вы заметите шаблон:
если N mod 4 = 1
, чем F(N)=1
, если N mod 4 = 3
, чем F(N)=0
, если N mod 4 = 0
, чем F(N)=N
, если N mod 4 = 2
, чем F(N)=N
, нос первым битом, равным 1
, поэтому N|1
сложная часть получает это в одном утверждении без условий, плохо объясняющих логику, которую я использовал для этого.
возьмите первые 2 значащих бита N, назовите их:
b0
и b1
, и они получаются с:
b0 = N&1
b1 = N&3>>1
Обратите внимание, что если b0 == 1
, мы должны 0
все биты, но если это не все биты, кроме первого, то остаются неизменными.Мы можем сделать это следующим образом:
N & (b0-1)
: это работает из-за дополнения 2, -1
равно числу со всеми битами, установленными в 1
и 1-1=0
, поэтому, когда b0=1
thisприводит к F(N)=0
.. так что это первая часть функции:
F(N)= (N&(b0-1))...
теперь это будет работать для N mod 4 == 3
и 0
, для других 2 случаев давайте рассмотрим только b1
, b0
и F(N)0
:
b0|b1|F(N)0
--+--+-----
1| 1| 0
0| 0| 0
1| 0| 1
0| 1| 1
Хорошо, надеюсь, эта таблица истинности выглядит знакомой!это b0 XOR b1 (b1^b0)
.так что теперь, когда мы знаем, как получить последний бит, давайте поместим это в нашу функцию:
F(N)=(N&(b0-1))|b0^b1
и все, функция без использования условных выражений.также это полезно, если вы хотите вычислить XOR из положительных чисел от a до b.Вы можете сделать: F(a) XOR F(b)
.