巧妙的位運算及模運算

2021-08-31 04:36:07 字數 726 閱讀 7563

原帖:

輸入2的n次方:

如果突然要你輸入2的19次方,你是不是還要想一下呢?敲個524288多累啊。用位運算:1 < < 19又快又準。

乘除2的倍數:

千萬不要用乘除法,非常拖效率。只要知道左移1位就是乘以2,右移1位就是除以2就行了。

比如要算25 * 4,用25 << 2就好啦。

判斷偶數:

a % 2取模是最常用的判斷方法之一。這樣要用到除法運算,不好。實際上,還是用位運算解決:a & 1。效果和a % 2是一樣的,但是要快得多。

對2的倍數取模:

類似上面的方法。對2的倍數取模,只要將數與2的倍數-1做與運算就可以了。如:

a % 8 = a & (8-1)

節省乘除法可以提高效率。

判斷乙個整數是否是處於 0-65535 之間(常用的越界判斷):

用一般的 (a >= 0) && (a <= 65535) 可能要兩次判斷。

改用位運算只要一次:

a & ~((1 << 16)-1)

後面的常數是編譯時就算好了的。其實只要算一次邏輯與就行了。

算掩碼:

比如乙個擷取低6位的掩碼:0×3f

用位運算這麼表示:(1 << 6) - 1

這樣也非常好讀取掩碼,因為掩碼的位數直接體現在表示式裡。

還有,做乙個迴圈限定的時候可以用模. 比如只需要0-2的不停迴圈 for( int i=0 ; i<3; i=(++i)%3 )

巧妙運用位運算

本文旨在通過兩道巧妙運用位運算的題,認識位運算的魅力 題意 給定兩個序列 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做與運算,...

位運算的巧妙設計

位運算子 例子名稱 結果 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 的位設為...