C C 關於按位操作符

2021-08-02 18:21:08 字數 3152 閱讀 8780

這一篇就簡單講下c++按位操作符使用方法。

一、移位操作符(2位元組16位下)

1.左移操作符

句法:value << shift (將指定值的所有位向左移動指定位數並將結果返回)

例如:

int n1 = 568;

int n2 = n1 << 3; //值也可以用字面值:int n2 = 568 << 3;

std::cout << n2 << std::endl;

上面**,將值n1(568)所有位向左移動3位 並將結果返回給n2 相當於:568*2^3

實現細節:

如圖**第一行所示,值568是十進位制的,在計算機內部都是以二進位制儲存的,所以轉換成二進位制為:1000111000 (前面的0已省去),當處理int n2 = n1 << 3;時,將執行左移操作,左移3位,所以移動後為圖中**第二行所示,結果為:1000111000000 (二進位制)也就是十進位制的 4544 (568*2^3)然後將結果返回給n2。

注意:所有位左移後,尾部騰出的各位將用0進行填充。

2.右移操作符

句法:value >> shift(將指定值的所有位向右移動指定位數並將結果返回)

例如:

int n1 = 731;

int n2 = n1 >> 3; //同上 也可以用int n2 = 731 >> 3:

std::cout << n2 << std::endl;

上面**,將值n1(731)所有位向右移動3位 並將結果返回給n2 相當於731/2^3 只是由於移位操作符是針對無符號整形的 返回的也是整形 所以向右移動3位後是91

實現細節:

如圖**第一行所示,值731轉換成二進位制就是1011011011,當處理n1 >> 3移位指令時,將該值的二進位制所有位向右移動3位,超過邊界的將被刪除(虛線內的),然後系統將自動為前面騰出來的各位填充0,得到結果為:1011011(前面0可省去)也就是十進位制的91,並將結果返回給n2。

另外上面所講的左移 右移操作符都可以用另一種形式,例如:當n2已定義為整型變數 則n2 >>=3 相當於int n2 = n2 >> 3 和  n2<<=3相當於int n2 = n2 << 3 。

二、邏輯按位操作符

操作符分別有:!  ~(按位取反) &(按位與) |(按位或) ^(按位異或)

先來講下(!)操作符,句法:!value

int n1 = 10;

int n2 = !n1; //或int n2 = !10;

std::cout << n2 << std::endl;

該操作符將指定值若是非零均轉換成false,即0。將值為0的轉換成true 即1,例如上面**因為n1的值(10)為非0值,所以轉換成0。

再來講下(~)操作符,句法:~value

假如有以下**:

int v = 463;

unsigned int num = ~v; //或直接 ~463

std::cout << "num:" << num << std::endl; //num:4294966832

當執行第二行**時,系統自動將463所有位取反,並返回結果給num,實現細節 結果為第二行:

另外如果想得到某個整數型別的變數的可以儲存的最大值,可以使用~0,例如:

unsigned char v1 = ~0;   //結果v1 = 255        相當於:ff

unsigned int v2 = ~0; //結果v2 = 4294967295 相當於:ffffffff

然後是&(按位與)操作符,句法:value1 & value2

unsigned int newnum = 683 & 713;   //newnum = 649

std::cout << "newnum:" << newnum << std::endl;

當有倆值:683 713 進行按位與運算後得到結果:649 實現細節:

**第一行是683的系統內部儲存格式二進位制的形式,第二行是713的二進位制形式,當這倆值進行按位與時,系統會對比這倆二進位制數列的所有位,如果倆值相同位數的值都為1則結果的對應位就為1,否則為0。

接著|(按位或)操作符,句法: value1 | value2

unsigned int newnum = 683 | 713;   //newnum = 747

std::cout << "newnum:" << newnum << std::endl;

還是用上面的倆值(683 713)來進行按位或操作,結果為747,實現細節:

當執行按位或操作時,系統將對倆值的所有對應二進位制位進行比較,如果倆值對應的二進位制位其中乙個為1,則結果對應的二進位制位就為1,都為0的話,結果對應位就為0。

最後是^(按位異或)操作符,句法:value1 ^ value2。

unsigned int newnum = 683 ^ 713;   //newnum = 98

std::cout << "newnum:" << newnum << std::endl;

假設對683和713進行按位異或操作後,將得到結果98,實現細節:

當執行按位異或操作時,系統將對倆值的所有對應的二進位制位進行比較,如果倆值對應的二進位制位其中乙個值為1(而不是倆個)則結果對應的二進位制位就為1,如果倆值對應的二進位制位都為1或都為0,結果對應的二進位制位則為0。

好了,以上就是我對所有按位操作符的小小的使用方法與總結,如果有問題的地方,還請大家指出來,共同進步~謝謝!

按位操作符

按位操作符 用來操作整數基本資料型別中的單個 bit 對兩個引數中對應的位執行布林代數計算,最終生成乙個結果 1.二元操作符 如果兩個輸入位都是1,則按位 與 操作符 生成乙個輸出位1,否則生成乙個輸出位0,如果兩個輸入位有乙個是1,則按位 或 操作符 生成乙個輸出位1,只有兩個輸入位都是0時,才會...

c 按位操作符

位運算是指按二進位制進行的運算。在程式中,常常需要處理二進位制位的問題。c c 語言提供了6個位操作運算子。這些運算子只能用於整型運算元,即只能用於帶符號或無符號的char,short,int與long型別。在實際應用中,建議用unsigned整型運算元,因為帶符號運算元可能因為不同機器結果不同。c...

Java移位操作符以及按位操作符

按位操作符 針對兩個整數引數中的對應位執行布林代數運算,並生成乙個結果。按位與 如果兩個輸入位都是1則生成乙個輸出位1,否則生成乙個輸出位0。按位或 如果兩個輸入位只要有一位是1則生成乙個輸出位1.否則生成乙個輸出位為0。按位異或 如果兩個輸入位只有其中一位是1那麼生成輸出位1,否則生成乙個輸出位為...