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)
次のように説明しました:
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である場合。
a & (~(a-b) >> 31)
前記(~(a-b) >> 31)
の表現(a-b)
シンボルビット反転。
場合はa >= b
、結果が反転している-1a & -1 = a
場合はa < b
、否定結果が0です、a & 0 = 0
ときですa >= b
結果は、あるとき、そうでない場合、結果は0です。
- 最後に、最初の二つの結果
或
の計算は、最初の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]