位運算子
例子名稱
結果$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取模是最常用的判斷方法之...