日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【算法学习】位运算

發布時間:2024/1/1 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【算法学习】位运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

任何信息在計算機中都是采用二進制表示的,數據在計算機中是以補碼形式存儲的,位運算就是直接對整數在內存中的二進制位進行運算。由于位運算直接對內存數據進行操作,不需要轉換成十進制,因此處理速度非常快,在信息學競賽中往往可以優化理論時間復雜度的系數。同時,一個整數的各個二進制位互不影響,利用位運算的一些技巧可以幫助我們簡化程序代碼。

C++提供了按位與(&)、按位或(I)、按位異或(^)、取反(~)、左移(<<)、右移(>>)這6種位運算符。這些運算符只能用于整型操作數,即只能用于帶符號或無符號的char、short、int與long類型。

“a&b”是指將參加運算的兩個整數a和b,按二進制位進行“與”運算。如果兩個相應的二進制位數字都為1,則該位的結果為1;否則為0。這里的1可以理解為邏輯中的true,0可以理解為邏輯中的false。“按位與”其實與邏輯上“與”的運算規則一致。

//3-00000011//5-00000101int a = 3;int b = 5;int c = a & b;cout << c<< endl; // 00000001

“a|b”是指將參加運算的兩個整數a和b,按二進制位進行“或”運算。如果兩個相應的二進制位數字有一個為1,則該位的結果為1否則為0。“按位或”其實與邏輯上“或”的運算規則一致。

// 48 - 00110000 //15 - 0000111int a = 48; int b = 15; int c = a | b; cout<< c<< endl; // 63 - 00111111

“a^b”是指將參加運算的兩個整數a和b,按二進制位進行“異或”運算。如果兩個相應的二進制位數字不相同,則該位的結果為1;否則為0。

a^0 = a? ? ? ? ?a^a = 0

// 52 - 00110100 //15-00001111 int a = 52; int b = 15; int c = a ^ b;cout << c<< endl; // 59 - 00111011

“~a”是指將整數a的各個二進制位都取反,即1變為0,0變為1。“~”是一元運算符。

cout << ~9 << endl; /*9 - 00001001 取反 - 11110110 補碼11110101 反碼10001010 原碼最高位 1 表示負數 -10*/

“a<<b”是指將整數a的各個二進制位左移b位,高位丟棄,低位用0補齊。需要注意的是b必須是非負整數。在高位沒有1丟棄的情況下,a<<1相當于a*2。

char a = (143<<2);printf("%d", a);/*143 - 10001111左移2 - 1000111100 60*/

“a>>b”是指將整數a的各個二進制位右移b位,低位丟棄。對于無符號數,高位補0。對于有符號數,某些機器將對左邊空出的部分用符號位填補(即“算術移位”),而另一些機器則對左邊空出的部分用0填補(即“邏輯移位”)。同樣,b必須是非負整數。a>>1相當于a/2。

char a = (15 >> 2 ); printf( "%d",a); /*15 - 00001111右移位2 - 00000011 3 */char a = (-15 >> 2 ); printf( "%d",a ); /*15 - 10001111反碼 - 11110000 補碼 - 11110001 右移2 - 1111110001 反碼 - 11111011 原碼 - 10000100 -4 */

位運算符也可以與賦值運算符組成復合運算符。

例如a &=b相當于a=a&b,a<<=2相當于a=a<<2。

位運算符也是有優先級的,例如

  • “加減”高于“>>”“<<”
  • “~”“!”“++”“-”一致 ,高于“乘除”
  • “關系運算” 高于?“&” 高于 “^” 高于 “|”高于“&&”“||”

為了避免出錯,增強程序的可讀性,利于調試,建議在需要的地方添加括號來保證優先運算。比如1<<5-1,建議寫成1<<(5-1),等價于1<<4。

例1:交換和取平均值

#include<iostream> using namespace std; int main() { //交換int x = 3,y = 9,z;x^= y; //x = x^y;y^= x; // y = y^x = (y ^ (x^y) ) =x;x^= y; //x = x^y = (x^y)^x = y;cout << x << " " << y << endl;//取平均值z = (x&y) + ((x^y)>>1 );cout << z << endl;return 0;}

?例2:整數冪

判斷一個數n是不是2的整數冪,比如64=2^6,所以輸出“yes”,而65 無法表示成2的整數冪形式,所以輸出"no"。n在int 范圍以內。

  • 【問題分析】
  • 我們考慮一個數如果是2的整數冪會有什么特殊性。觀察發現64轉換成二進制為0100000,只有一個位是1。將這個數減去1,就變成00111111的形式,我們將這2個數做按位與運算,發現結果為0。分析發現,如果一個數不能表示成2的整數冪形式,則以上過程的運算結果一定不為0。所以,可以利用位運算將算法的時間復雜度優化成O(1)。
#include<iostream> using namespace std; int main() {int n;cin >> n;if (n&(n-1))cout << "no";elsecout << "yes";return 0;}

總結

以上是生活随笔為你收集整理的【算法学习】位运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。