檢測乙個無符號數是不為2^n-1(^為冪): x&(x+1)
將最右側0位改為1位: x | (x+1)
二進位制補碼運算公式:
-x = ~x + 1 = ~(x-1)
~x = -x-1
-(~x) = x+1
~(-x) = x-1
x+y = x - ~y - 1 = (x|y)+(x&y)
x-y = x + ~y + 1 = (x|~y)-(~x&y)
x^y = (x|y)-(x&y)
x|y = (x&~y)+y
x&y = (~x|y)-~x
x==y: ~(x-y|y-x)
x!=y: x-y|y-x
x< y: (x-y)^((x^y)&((x-y)^x))
x<=y: (x|~y)&((x^y)|~(y-x))
x< y: (~x&y)|((~x|y)&(x-y))//無符號x,y比較
x<=y: (~x|y)&((x^y)|~(y-x))//無符號x,y比較
使用位運算的無分支**:
計算絕對值
int abs( int x )
符號函式:sign(x) = -1, x<0; 0, x == 0 ; 1, x > 0
int sign(int x)
三值比較:cmp(x,y) = -1, xy
int cmp( int x, int y )
doz=x-y, x>=y; 0, x>31) ;
}int max(int x, int y )
不使用第三方交換x,y:
1.x ^= y ; y ^= x ; x ^= y ;
2.x = x+y ; y = x-y ; x = x-y ;
3.x = x-y ; y = y+x ; x = y-x ;
4.x = y-x ; x = y-x ; x = x+y ;
雙值交換:x = a, x==b; b, x==a//常規編碼為x = x==a ? b :a ;
1.x = a+b-x ;
2.x = a^b^x ;
下捨入到2的k次方的倍數:
1.x & ((-1)<>k)《位計數,統計1位的數量:
1.int pop(unsigned x)
2.int pop(unsigned x) ;
return table[x&0xff]+table[(x>>8)&0xff]+table[(x>>16)&0xff]+table[(x>>24)] ;
}奇偶性計算:
x = x ^ ( x>>1 ) ;
x = x ^ ( x>>2 ) ;
x = x ^ ( x>>4 ) ;
x = x ^ ( x>>8 ) ;
x = x ^ ( x>>16 ) ;
結果中位於x最低位,對無符號x,結果的第i位是原數第i位到最左側位的奇偶性
位反**
unsigned rev(unsigned x)
遞增位反轉後的數:
unsigned inc_r(unsigned x)
while( x < m ) ;
return x ;
}混選位:
abcd efgh ijkl mnop abcd efgh ijkl mnop->aabb ccdd eeff gghh iijj kkll mmnn oopp
unsigned ps(unsigned x)
位壓縮:
選擇並右移字x中對應於掩碼m的1位的位,如:compress(abcdefgh,01010101)=0000bdfh
compress_left(x,m)操作與此類似,但結果位在左邊: bdfh0000.
unsigned compress(unsigned x, unsigned m)
實際置換:
int rep( unsigned x )
二進位製碼到gray碼的轉換:
unsigned b2g(unsigned b )
gray碼到二進位製碼:
unsigned g2b(unsigned g)
找出最左0位元組的位置:
int zbytel( unsigned x )
;unsigned y ;
y = (x&0x7f7f7f7f) + 0x7f7f7f7f ;
y = ~(y|x|0x7f7f7f7f) ;
return table[y*0x00204081 >> 28] ;//乘法可用移位和加完成
}
位運算的技巧
1.找到乙個整數的二進位制中最後一位1的位置 int split a a 1 a int split a a 1 注意split不是位置。2.將乙個數的最後一位1變為0 n n n 1 3.乙個整數的二進位制中1的個數 int res 0 while n 0 return res 4.判斷乙個數是不...
位運算的技巧
在討論位運算之前有必要補充一下計算機底層使用的編碼表示,計算機內部儲存 計算的任何資訊都是由二進位制 0和1 表示,而二進位制有三種不同的表示形式 原碼 反碼和補碼。計算機內部使用補碼來表示。原碼,就是其二進位制表示 注意,有一位符號位 反碼,正數的反碼就是原碼,負數的反碼是符號位不變,其餘位取反 ...
位運算的技巧
2019 09 03 10 29 36 x x 1 相當於消除了 x 從右向左數遇到的第乙個 1。應用 一 用 o 1 時間檢測整數 n 是否是 2 的冪次。若 n 是 2 的冪次,則 n n 1 0。應用 二 計算整數二進位制中包含 1 的個數。public int countones int n...