談談C語言中位運算你要知道的那些事兒
一、概念說明
1.概念
先來看一下位運算的概念:
1.1位運算
位運算簡單來說,就是按二進制位進行運算。
位運算: 從現(xiàn)代計算機中所有的數(shù)據(jù)二進制的形式存儲在設備中。即 0、1 兩種狀態(tài),計算機對二進制數(shù)據(jù)進行的運算(+、-、*、/)都是叫位運算,即將符號位共同參與運算的運算。
了解了位運算之后,我們來看一下位運算符
1.2位運算符
| 符號 | 描述 | 運算規(guī)則 |
|---|---|---|
| & | 按位與 | 兩個位都為1時,結果才為1 |
| | | 按位或 | 兩個位都為0時,結果才為0 |
| ^ | 按位異或 | 兩個位相同為0,相異為1 |
| ~ | 按位取反 | 0變1,1變0 |
| << | 左移 | 各二進位全部左移若干位,高位去掉,低位補0 |
| >> | 右移 | 各二進位全部右移若干位,對無符號數(shù),高位補0,有符號數(shù),編譯器不同,處理方法不同 |
關于右移:不同的編譯器處理方法可能會不一樣,有的會補符號位,有的會補0。
★小提示:
a.邏輯位運算都是以 (bit)為單位。
b.位運算符的操作數(shù)必須是整數(shù)/字符類型。
2.舉例及補充
2.1位運算
以+為例
舉一個簡單的例子來看下( + - * \)位運算:
int a = 3; int b = 4; int c = a + b;
計算兩個數(shù)的和,因為在計算機中都是以二進制來進行運算,所以上面我們所給的 int 變量會在機器內(nèi)部先轉換為二進制在進行相加:
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位運算符
關于每個運算符舉一個簡單的例子,來加深理解。
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)
因此結果等于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)
因此結果等于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)
因此結果等于3(十進制)
2.2.4按位非(取反)“~”
運算規(guī)則:
~1 = 0
~0 = 1
簡要口訣:1變0,0變1
例如:
~15
~0000 1111(十進制:~15)
=1111 0000(十進制:240)
因此結果等于240(十進制)
2.2.5左移“<<”
補充:若左移時舍棄的高位不包含1,則每左移一位,相當于該數(shù)乘以2。
例如:
1 << 2
即 1左移兩位
0000 0001(十進制:1)
左移兩位(<<2)后:
0000 0100(十進制:4)
結果為:4
2.2.6右移“>>”
補充: 操作數(shù)每右移一位,相當于該數(shù)除以2。
例如:
8 >> 2
即 8右移兩位
0000 1000(十進制:8)
右移兩位( >>2 )后:
0000 0010(十進制:2)
結果為:2
了解了這些概念之后,我們一起來看一下問題吧!
二、問題實戰(zhàn)
自己編寫了個題,僅用于學習,目的是為了加深對位運算的理解。
大家可以嘗試實現(xiàn)一下
1.問題描述(開放題)
Problem Description
自己設計程序,要求用六種位運算符實現(xiàn)對兩個整數(shù)的運算。
2.輸入輸出
Input
無
Output
兩個整數(shù)經(jīng)六種位運算分別得到的結果
三、源碼實現(xiàn)(+詳細注釋)
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);//輸出結果為1
//按位或 |
a=3;
b=5;
d=a|b;
//經(jīng)過按位或運算,得到c的值為0000 0111
//以十進制輸出
printf("經(jīng)過按位或運算后,可得d的值:%d\n",d);//輸出結果為7
//按位異或 ^
a=3;
b=5;
e=a^b;
//經(jīng)過按位異或運算,得到c的值為0000 0110
//以十進制輸出
printf("經(jīng)過按位異或運算后,可得e的值:%d\n",e);//輸出結果為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);//輸出結果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);//輸出結果h的值為12,i的值為1
return 0;//返回0,代表程序執(zhí)行結束
}
關于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;
}
四、輸出結果展示
1.輸出結果
經(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.輸出結果(圖示版)

總結
到此這篇關于C語言中位運算你要知道的那些事兒的文章就介紹到這了,更多相關C語言中的位運算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++??STL?_?Vector使用及模擬實現(xiàn)
這篇文章主要介紹了C++ STL_Vector使用及模擬實現(xiàn),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-08-08
C語言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對齊詳解
這篇文章主要為大家詳細介紹了C語言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對齊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
C/C++程序開發(fā)中實現(xiàn)信息隱藏的三種類型
這篇文章主要介紹了C/C++程序開發(fā)中實現(xiàn)信息隱藏的三種類型的相關資料,需要的朋友可以參考下2016-02-02

