談?wù)凜語言中位運算你要知道的那些事兒
一、概念說明
1.概念
先來看一下位運算的概念:
1.1位運算
位運算簡單來說,就是按二進制位進行運算。
位運算: 從現(xiàn)代計算機中所有的數(shù)據(jù)二進制的形式存儲在設(shè)備中。即 0、1 兩種狀態(tài),計算機對二進制數(shù)據(jù)進行的運算(+、-、*、/)都是叫位運算,即將符號位共同參與運算的運算。
了解了位運算之后,我們來看一下位運算符
1.2位運算符
符號 | 描述 | 運算規(guī)則 |
---|---|---|
& | 按位與 | 兩個位都為1時,結(jié)果才為1 |
| | 按位或 | 兩個位都為0時,結(jié)果才為0 |
^ | 按位異或 | 兩個位相同為0,相異為1 |
~ | 按位取反 | 0變1,1變0 |
<< | 左移 | 各二進位全部左移若干位,高位去掉,低位補0 |
>> | 右移 | 各二進位全部右移若干位,對無符號數(shù),高位補0,有符號數(shù),編譯器不同,處理方法不同 |
關(guān)于右移:不同的編譯器處理方法可能會不一樣,有的會補符號位,有的會補0。
★小提示:
a.邏輯位運算都是以 (bit)為單位。
b.位運算符的操作數(shù)必須是整數(shù)/字符類型。
2.舉例及補充
2.1位運算
以+為例
舉一個簡單的例子來看下( + - * \)位運算:
int a = 3; int b = 4; int c = a + b;
計算兩個數(shù)的和,因為在計算機中都是以二進制來進行運算,所以上面我們所給的 int 變量會在機器內(nèi)部先轉(zhuǎn)換為二進制在進行相加:
3(a): 0 0 0 0 0 0 1 1
加上(+)
4(b): 0 0 0 0 0 1 0 0
等于(=)
7(c ): 0 0 0 0 0 1 1 1
通過觀察我們可以發(fā)現(xiàn),相比在代碼中直接使用(+、-、*、/)運算符,如果有位運算符的話,代碼運行效率會不會更高,隨著位運算符后續(xù)的出現(xiàn),發(fā)現(xiàn)其實確實是這樣。
下面一起來看一下位運算符:
2.2位運算符
關(guān)于每個運算符舉一個簡單的例子,來加深理解。
2.2.1按位與“&”
運算規(guī)則:
0 & 0 = 0
0 & 1 =0
1 & 0 = 0
1 & 1 = 1
簡要口訣:(同1為1,其余為0)
例如:
3 & 5
0000 0011(十進制:3)
&
0000 0101(十進制:5)
=
0000 0001 (十進制:1)
因此結(jié)果等于1(十進制)
2.2.2按位或“|”
運算規(guī)則:0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
簡要口訣:同0為0,其余為1
例如:
3 | 5
0000 0011(十進制:3)
|
0000 0101(十進制:5)
=
0000 0111(十進制:7)
因此結(jié)果等于7(十進制)
2.2.3按位異或“^”
運算規(guī)則:
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
簡要口訣:相同為0,不同為1
例如:
4 ^ 7
0000 0100(十進制:4)
^
0000 0111 (十進制:7)
=
0000 0011(十進制:3)
因此結(jié)果等于3(十進制)
2.2.4按位非(取反)“~”
運算規(guī)則:
~1 = 0
~0 = 1
簡要口訣:1變0,0變1
例如:
~15
~0000 1111(十進制:~15)
=1111 0000(十進制:240)
因此結(jié)果等于240(十進制)
2.2.5左移“<<”
補充:若左移時舍棄的高位不包含1,則每左移一位,相當(dāng)于該數(shù)乘以2。
例如:
1 << 2
即 1左移兩位
0000 0001(十進制:1)
左移兩位(<<2)后:
0000 0100(十進制:4)
結(jié)果為:4
2.2.6右移“>>”
補充: 操作數(shù)每右移一位,相當(dāng)于該數(shù)除以2。
例如:
8 >> 2
即 8右移兩位
0000 1000(十進制:8)
右移兩位( >>2 )后:
0000 0010(十進制:2)
結(jié)果為:2
了解了這些概念之后,我們一起來看一下問題吧!
二、問題實戰(zhàn)
自己編寫了個題,僅用于學(xué)習(xí),目的是為了加深對位運算的理解。
大家可以嘗試實現(xiàn)一下
1.問題描述(開放題)
Problem Description
自己設(shè)計程序,要求用六種位運算符實現(xiàn)對兩個整數(shù)的運算。
2.輸入輸出
Input
無
Output
兩個整數(shù)經(jīng)六種位運算分別得到的結(jié)果
三、源碼實現(xiàn)(+詳細(xì)注釋)
1.注釋版
//編碼及注釋:Code_流蘇 //定義頭文件 #include<stdio.h> int main() { //給定兩個整數(shù)a和b 分別初始賦值為3和5 //定義d e f g h i分別存儲各種位運算后的值 unsigned char a=3,b=5,c,d,e,f,g,h,i; // a(3): 0000 0011 // b(5): 0000 0101 //按位與 & c=a&b; //經(jīng)過按位與運算,得到c的值為0000 0001 //以十進制輸出 printf("經(jīng)過按位與運算后,可得c的值:%d\n",c);//輸出結(jié)果為1 //按位或 | a=3; b=5; d=a|b; //經(jīng)過按位或運算,得到c的值為0000 0111 //以十進制輸出 printf("經(jīng)過按位或運算后,可得d的值:%d\n",d);//輸出結(jié)果為7 //按位異或 ^ a=3; b=5; e=a^b; //經(jīng)過按位異或運算,得到c的值為0000 0110 //以十進制輸出 printf("經(jīng)過按位異或運算后,可得e的值:%d\n",e);//輸出結(jié)果為6 //按位非(取反) ~ a=3; b=7; //0000 0111 此處重新賦值 排除偶然性 f=~a; g=~b; //經(jīng)過按位非(取反)運算,得到f的值為1111 1100 g的值為1111 1000 //以十進制輸出 printf("經(jīng)過按位非運算后,可得f和g的值:%d %d\n",f,g);//輸出結(jié)果f的值為252,g的值為248 //移位 左移:>> 右移:>> a=3; b=5; h=a<<2; i=b>>2; //經(jīng)過位移運算,得到f的值為0000 1100 g的值為0000 0001 //以十進制輸出 printf("經(jīng)過移位運算后,可得f和g的值:%d %d\n",h,i);//輸出結(jié)果h的值為12,i的值為1 return 0;//返回0,代表程序執(zhí)行結(jié)束 }
關(guān)于unsigned char的解釋:
unsigned char是無符號字節(jié)型,char類型變量的大小通常為1個字節(jié)(1字節(jié)=8個位),且屬于整型。這就是為什么要用unsigned char的原因。
2.純源碼版
#include<stdio.h> #include<stdlib.h> int main() { unsigned char a=3,b=5,c,d,e,f,g,h,i; c=a&b; printf("經(jīng)過按位與運算后,可得c的值:%d\n",c); a=3; b=5; d=a|b; printf("經(jīng)過按位或運算后,可得d的值:%d\n",d); a=3; b=5; e=a^b; printf("經(jīng)過按位異或運算后,可得e的值:%d\n",e); a=3; b=7; f=~a; g=~b; printf("經(jīng)過按位非運算后,可得f和g的值:%d %d\n",f,g); a=3; b=5; h=a<<2; i=b>>2; printf("經(jīng)過移位運算后,可得f和g的值:%d %d\n",h,i); return 0; }
四、輸出結(jié)果展示
1.輸出結(jié)果
經(jīng)過按位與運算后,可得c的值:1
經(jīng)過按位或運算后,可得d的值:7
經(jīng)過按位異或運算后,可得e的值:6
經(jīng)過按位非運算后,可得f和g的值:252 248
經(jīng)過移位運算后,可得f和g的值:12 1--------------------------------
Process exited after 0.3508 seconds with return value 0
請按任意鍵繼續(xù). . .
2.輸出結(jié)果(圖示版)
總結(jié)
到此這篇關(guān)于C語言中位運算你要知道的那些事兒的文章就介紹到這了,更多相關(guān)C語言中的位運算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ 中動態(tài)鏈接庫--導(dǎo)入和導(dǎo)出的實例詳解
這篇文章主要介紹了C++ 中動態(tài)鏈接庫--導(dǎo)入和導(dǎo)出的實例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09C++??STL?_?Vector使用及模擬實現(xiàn)
這篇文章主要介紹了C++ STL_Vector使用及模擬實現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08C語言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對齊詳解
這篇文章主要為大家詳細(xì)介紹了C語言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對齊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03C/C++程序開發(fā)中實現(xiàn)信息隱藏的三種類型
這篇文章主要介紹了C/C++程序開發(fā)中實現(xiàn)信息隱藏的三種類型的相關(guān)資料,需要的朋友可以參考下2016-02-02淺談C++基類的析構(gòu)函數(shù)為虛函數(shù)
本文重點:應(yīng)該為多態(tài)基類聲明虛析構(gòu)器。一旦一個類包含虛函數(shù),它就應(yīng)該包含一個虛析構(gòu)器。如果一個類不用作基類或者不需具有多態(tài)性,便不應(yīng)該為它聲明虛析構(gòu)器。2015-10-10