位操作實用技巧大全

2021-06-02 23:32:13 字數 2943 閱讀 3513

檢測乙個無符號數是不是2^n-1(^為冪):

x&(x+1)

將最右側0位改為1位:

x | (x+1)
獲得最右側的0

(x | (x+1))^x

將最右側的1位改為0位

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:

x ^= y ; y ^= x ; x ^= y ;

x = x+y ; y = x-y ; x = x-y ;

x = x-y ; y = y+x ; x = y-x ;

x = y-x ; x = y-x ; x = x+y ;

雙值交換:

if (x==a) x = b;

else  x = a;

//常規編碼為x = ( x==a ? b :a) ;

x = a+b-x ;

x = a^b^x ;

//下捨入到2的k次方的倍數:

x & ((-1)<>k)<>1)&0x55555555) ;

x = (x&0x33333333) + ((x>>2) & 0x33333333 ) ;

x = (x+(x>>4)) & 0x0f0f0f0f ;

x = x + (x>>8) ;

x = x + (x>>16) ;

return (x & 0x0000003f) ;

}

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)

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] ;//乘法可用移位和加完成

}

Bash 實用技巧大全

後台執行程式 使用子shell,比如 cd commlib make 命令替換,和 的作用是一樣的 heredoc 使用舉例 比如你要在 shell 指令碼中 使用 awk 指令碼 awk f eof 執行整數計算 66 2 if 算術運算 if 字串運算 alias 定義命令別名 dot 或 so...

實用技巧之位運算

實用技巧 位運算1 十進位制 01 二進位制 兩個二進位製碼位置如果同時是1則結果為1,其餘為0 b 1所以 1 2 是判斷奇偶的,是奇數則為1 右移運算 1.二進位製碼向右挪x個長度,右邊擠掉 2.可以取出二進位制表示下的某一位,例如 n 1 1 1 除二 b x就可以取出b的二進位製碼中的第x位...

OFFICE操作實用技巧 一

word excel ppt 這些東西 相信每個做開發的都沒辦法遺棄 有時候有些小技巧不知道做起來還真不方便 於是就有了這個想法 把日常的操作技巧整理出來以方便你我.題記 問題起源 在網上發現一篇好文章,想 down 下來。你還真別看,這麼簡單的事,誰搞不定?可就是有太多的麻煩。你也知道,現在網路上...