談談C語言中位運算你要知道的那些事兒
一、概念說明
1.概念
先來看一下位運算的概念:
1.1位運算
位運算簡單來說,就是按二進制位進行運算。
位運算: 從現代計算機中所有的數據二進制的形式存儲在設備中。即 0、1 兩種狀態(tài),計算機對二進制數據進行的運算(+、-、*、/)都是叫位運算,即將符號位共同參與運算的運算。
了解了位運算之后,我們來看一下位運算符
1.2位運算符
| 符號 | 描述 | 運算規(guī)則 |
|---|---|---|
| & | 按位與 | 兩個位都為1時,結果才為1 |
| | | 按位或 | 兩個位都為0時,結果才為0 |
| ^ | 按位異或 | 兩個位相同為0,相異為1 |
| ~ | 按位取反 | 0變1,1變0 |
| << | 左移 | 各二進位全部左移若干位,高位去掉,低位補0 |
| >> | 右移 | 各二進位全部右移若干位,對無符號數,高位補0,有符號數,編譯器不同,處理方法不同 |
關于右移:不同的編譯器處理方法可能會不一樣,有的會補符號位,有的會補0。
★小提示:
a.邏輯位運算都是以 (bit)為單位。
b.位運算符的操作數必須是整數/字符類型。
2.舉例及補充
2.1位運算
以+為例
舉一個簡單的例子來看下( + - * \)位運算:
int a = 3; int b = 4; int c = a + b;
計算兩個數的和,因為在計算機中都是以二進制來進行運算,所以上面我們所給的 int 變量會在機器內部先轉換為二進制在進行相加:
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ā)現,相比在代碼中直接使用(+、-、*、/)運算符,如果有位運算符的話,代碼運行效率會不會更高,隨著位運算符后續(xù)的出現,發(fā)現其實確實是這樣。
下面一起來看一下位運算符:
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,則每左移一位,相當于該數乘以2。
例如:
1 << 2
即 1左移兩位
0000 0001(十進制:1)
左移兩位(<<2)后:
0000 0100(十進制:4)
結果為:4
2.2.6右移“>>”
補充: 操作數每右移一位,相當于該數除以2。
例如:
8 >> 2
即 8右移兩位
0000 1000(十進制:8)
右移兩位( >>2 )后:
0000 0010(十進制:2)
結果為:2
了解了這些概念之后,我們一起來看一下問題吧!
二、問題實戰(zhàn)
自己編寫了個題,僅用于學習,目的是為了加深對位運算的理解。
大家可以嘗試實現一下
1.問題描述(開放題)
Problem Description
自己設計程序,要求用六種位運算符實現對兩個整數的運算。
2.輸入輸出
Input
無
Output
兩個整數經六種位運算分別得到的結果
三、源碼實現(+詳細注釋)
1.注釋版
//編碼及注釋:Code_流蘇
//定義頭文件
#include<stdio.h>
int main()
{
//給定兩個整數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;
//經過按位與運算,得到c的值為0000 0001
//以十進制輸出
printf("經過按位與運算后,可得c的值:%d\n",c);//輸出結果為1
//按位或 |
a=3;
b=5;
d=a|b;
//經過按位或運算,得到c的值為0000 0111
//以十進制輸出
printf("經過按位或運算后,可得d的值:%d\n",d);//輸出結果為7
//按位異或 ^
a=3;
b=5;
e=a^b;
//經過按位異或運算,得到c的值為0000 0110
//以十進制輸出
printf("經過按位異或運算后,可得e的值:%d\n",e);//輸出結果為6
//按位非(取反) ~
a=3;
b=7; //0000 0111 此處重新賦值 排除偶然性
f=~a;
g=~b;
//經過按位非(取反)運算,得到f的值為1111 1100 g的值為1111 1000
//以十進制輸出
printf("經過按位非運算后,可得f和g的值:%d %d\n",f,g);//輸出結果f的值為252,g的值為248
//移位 左移:>> 右移:>>
a=3;
b=5;
h=a<<2;
i=b>>2;
//經過位移運算,得到f的值為0000 1100 g的值為0000 0001
//以十進制輸出
printf("經過移位運算后,可得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("經過按位與運算后,可得c的值:%d\n",c);
a=3;
b=5;
d=a|b;
printf("經過按位或運算后,可得d的值:%d\n",d);
a=3;
b=5;
e=a^b;
printf("經過按位異或運算后,可得e的值:%d\n",e);
a=3;
b=7;
f=~a;
g=~b;
printf("經過按位非運算后,可得f和g的值:%d %d\n",f,g);
a=3;
b=5;
h=a<<2;
i=b>>2;
printf("經過移位運算后,可得f和g的值:%d %d\n",h,i);
return 0;
}
四、輸出結果展示
1.輸出結果
經過按位與運算后,可得c的值:1
經過按位或運算后,可得d的值:7
經過按位異或運算后,可得e的值:6
經過按位非運算后,可得f和g的值:252 248
經過移位運算后,可得f和g的值:12 1--------------------------------
Process exited after 0.3508 seconds with return value 0
請按任意鍵繼續(xù). . .
2.輸出結果(圖示版)

總結
到此這篇關于C語言中位運算你要知道的那些事兒的文章就介紹到這了,更多相關C語言中的位運算內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

