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