マジックビットコンピューティング

1.なし一時変数スワップ二つの数

排他的論理和演算

  • 両者の同じ数の排他的論理和が 0、すなわち、N ^ n = 0です。
  • OR独自排他任意の数は、n = 0であり、すなわち、N ^ 0。
  • サポート可換連想を
a = a ^ b   # (1)
b = a ^ b   # (2)
a = a ^ b   # (3)

次のように説明しました:

(1)a(2)に、あります

b = a ^ b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a

(1)、(2)(3)に同様の結果があります

a = a ^ b = (a ^ b) ^ a = (a ^ a) ^ b = 0 ^ b = b

2.パリティの数を決定します

AND演算

  • 0異なる、同一である1

番号を解析nは偶数か奇数である、最後のAバイナリを決定nは1または0です。これは、0が偶数、奇数が1で表されていることを示しています。

if n & 1 == 1: # n为奇数

3. 2 /ディビジョンテイク2

n << 1  # 左移一位,表示乘2
n >> 1  # 右移一位,表示除2

4. 2つの数の最大値

def max(a, b):
    return b & ((a-b) >> 31) | a & (~(a-b) >> 31)

次のように説明しました:

  1. b & ((a-b) >> 31)ここでは、(a-b) >> 31服用を表す(a-b)符号ビットを。

場合はb <= a、符号ビットが0です、b & 0 = 0

場合はb > a、符号ビットは-1です。b & -1 = b

場合には、b > a結果はそうでない場合、B、0である場合。

  1. a & (~(a-b) >> 31)前記(~(a-b) >> 31)の表現(a-b)シンボルビット反転

場合はa >= b、結果が反転している-1a & -1 = a

場合はa < b、否定結果が0です、a & 0 = 0

ときですa >= b結果は、あるとき、そうでない場合、結果は0です。

  1. 最後に、最初の二つの結果の計算は、最初の2つのステップの結果ので0、非ゼロ(すなわち、最大値)が存在しなければなりません。したがって、後の演算結果非ゼロ(すなわち、最大値)です。

2つの数の最小値

def max(a, b):
    return a & ((a-b) >> 31) | b & (~(a-b) >> 31)

前記絶対値

def abs(n):
    return (n ^ (n >> 31) - (n >> 31))

7.表示されますが唯一のデジタル一度調べるには

整数データのセットでは、残りの桁が2回表示、一つだけ番号が一度表示されています。一度だけ表示される番号を見つけます。

排他的OR演算の特性から見た:二つの同一の数字XOR結果は0であり、排他的論理和結果の数が0自体は、XORサポートと可換と連想だから、数字のすべての唯一のXOR演算は、結果は一つだけ番号が表示されています。としてl = [1,2,1,0,0]

1 ^ 2 ^ 1 ^ 0 ^ 0 = (1 ^ 1) ^ (0 ^ 0) ^ 2 = 0 ^ 0 ^ 2 = 2

def find_only(l):
    tmp = l[0]
    for i in range(1, len(l)-1):
        tmp ^= l[i]
    return tmp

l = [1,2,3,4,4,3,1,0,0]

おすすめ

転載: www.cnblogs.com/ghostlee/p/12114706.html