位運算的巧妙設計

2022-01-17 14:52:03 字數 1676 閱讀 2576

位運算子

例子名稱

結果$a & $b

and(按位與)

將把 $a 和 $b 中都為 1 的位設為 1。

$a | $b

or(按位或)

將把 $a 和 $b 中任何乙個為 1 的位設為 1。

$a ^ $b

xor(按位異或)

將把 $a 和 $b 中乙個為 1 另乙個為 0 的位設為 1。

~ $a

not(按位取反)

將 $a 中為 0 的位設為 1,反之亦然。

$a << $b

shift left(左移)

將 $a 中的位向左移動 $b 次(每一次移動都表示「乘以 2」)。

$a >> $b

shift right(右移)

將 $a 中的位向右移動 $b 次(每一次移動都表示「除以 2」)。

我們在程式設計生涯中,偶爾會遇見一些 類似 |(按位或) 、&(按位與)、^(按位異或)等位運算子,我們只是了解它們大概的含義,確很少運用在例項當中,我舉個例子:

e_error = 1;

e_compile_error = 64;

e_core_error = 16;

當我們去判斷乙個變數的值($severity)是否是以上中的乙個時,第一印象就想到以下方法:

if(e_error ==$severity || e_compile_error == $severity || e_user_error == $severity

) else

認真我們會發現,用位運算,能很快且巧妙的解決這個問題:

if(((e_error | e_compile_error | e_core_error ) & $severity) === $severity

) else

十進位制:e_error = 1; 換算成二進位制: 1

十進位制:e_compile_error = 64; 換算成二進位制: 1000000

十進位制:e_core_error = 16; 換算成二進位制: 10000

(e_error | e_compile_error | e_core_error ) 三個常量通過 | 位運算得到 1010001

((e_error | e_compile_error | e_core_error ) & $severity 也就是 1010001 & $severity,

當 $severity = 1 時:

1010001 & $severity = 1, 所以 (1010001 & $severity) == $severity ;

當 $severity = 1000000 時:

1010001 & $severity = 1000000, 所以 (1010001 & $severity) == $severity ;

當 $severity = 10000時:

1010001 & $severity = 10000, 所以 (1010001 & $severity) == $severity

當 $severity 的值是上述三個常量中的乙個,位運算之後就會得到與 $severity 本身的值一樣,

所以該運算成立。

從上述我們知道,位運算子能很快的解決我們的問題,尤其是在一些演算法當中,位運算子很常用,

巧妙運用位運算

本文旨在通過兩道巧妙運用位運算的題,認識位運算的魅力 題意 給定兩個序列 a,b 求 a,b 的最長公共子串行 a b le 10 5 時限 5s 目前求任意兩序列的最長公共子串行,是沒有複雜度低於 o a cdot b 的演算法的 回顧經典的 o a cdot b f max f f f a i ...

位運算的巧妙應用

與運算 或運算 異或運算 非運算 移位運算 和 題目要求 用乙個表示式,判斷乙個數x是否是2的n次方,即2,4,8,16 等,要求不可以用迴圈語句。解析 2,4,8,16這樣的數轉化成二進位制是10,100,1000,10000。如果x減去1後 低一位並且二進位制的每一位都是1 這個數與x做與運算,...

巧妙的位運算及模運算

原帖 輸入2的n次方 如果突然要你輸入2的19次方,你是不是還要想一下呢?敲個524288多累啊。用位運算 1 19又快又準。乘除2的倍數 千萬不要用乘除法,非常拖效率。只要知道左移1位就是乘以2,右移1位就是除以2就行了。比如要算25 4,用25 2就好啦。判斷偶數 a 2取模是最常用的判斷方法之...