[教學]C++ 超詳細位元運算+工作實例
文章推薦指數: 80 %
位元運算子(Bitwise operator) ,在數位設計上面有AND , OR , NOT , XOR 與補數..等運算,而在C++中,提供這些運算的就是位元運算子,而它們在程式 ...
關閉廣告
一個小小工程師的心情抒發天地
跳到主文
Writethecode,changetheworld
部落格全站分類:心情日記
相簿
部落格
留言
名片
Sep05Wed201811:07
[教學]C++超詳細位元運算+工作實例
遇到很多人問一個問題,甚至這考題根本萬年不衰,
所以我決定好好來寫一寫關於位元運算的部分,
至於會想要寫一些職務上的運用,是因為,其實我每天都會花一些些的時間,
去網路上幫人解解疑難雜症,甚至有些還會直接寄信問我,
再加上一些家教的經驗,其實我發現一件事情,
語法大家都很熟,只是,問題基本上都是卡在,
"不會用"的這件事情上面,
不知道什麼時候該使用,學了不知到要用在哪,
等真正專案開始的時候,只能自己摸索,
連架構上面.... 只能說很亂,所以,我決定從這篇開始,
在教學上面,多一些我自己實務上的經驗分享和使用方法,
如果,各位看官,有更好的方式,請不要吝嗇的在下方留言或寄信分享給我,
請相信,交流,永遠是讓自己更上一層樓的方式,沒有之一。
好了,廢話不多說,我們進入主題吧。
位元運算子(Bitwiseoperator),在數位設計上面有AND,OR,NOT, XOR與補數..等運算,而在C++中,提供這些運算的就是位元運算子,而它們在程式裡面的表達,則是AND(&), OR(|), NOT(!)以及補數(~)。
我們先來看看下面的表:
這個麻煩大家先記起來,不管用什麼方式,這很重要 !
至於我自己背的方式....
就是"AND只有11得1,其他為0,OR:00得0 其他都為1"...大概是這樣,僅供參考。
讓我們來先寫點Code舉個簡單的例子吧,
題目:如何判斷奇數偶數
描述:
奇數偶數,奇數偶數在二進制裡面,有一個萬年不變的規則,那就是,
[奇數,最右邊的那一個位元,絕對為1 ],
[偶數,最右邊的那一個位元,絕對為0],
這句話請重複跟我念三次,因為這是絕對,所以麻煩大家也記一下。
不信?很簡單,打開你電腦裡面的計算機→檢視→程式設計師模式
然後自己敲看看(工程師麻...要有點實驗精神)
接下來,我們上代碼:
這個程式的運算原理,奇數的數值若以二進位來表示,最右邊的位元一定會為1,而偶數最右邊則一定為0,所已在使用1來與輸入的值做&(AND)運算的時候,由於1除了最右邊的位元為1之外,其他位元都會是0,與輸入數值AND運算的結果,只會留下最右邊的位元為0或為的結果,其他部分都會被0AND運算遮蔽掉,這就是所謂的[位元遮罩]例如:00000100。
接下來,我們來看另外一個例子
題目:SWAP(交換)
描述:
交換數值,這個其實非常實用也非常常用,而且在一般初級面試的時候,這玩意也可以有一些變化,例如傳值、傳址、傳參,但是,這一篇我們的教學重點是在於位元運算,所以,我們還是把專注放在這邊吧。
首先,我先寫一個標準的交換方式(所謂的標準,就是書上基本上都會出現的方法)
接下來,我們用^(XOR)來實做看看:
然後,我們一行一行來看,
首先,我們知道
a=10,b=20
第一行a^=b;
可以拆開來變成
a=a^b
那10^20=多少?
10 =1010 ,20=10100
11110(二進位)=30(十進位)
也就是說,我們將a變成了30
第二行:b^=a;
拆開來變成b=b^a(30);
b是多少?b是20(10100)
所以我們再拆一次,變成b=(20)10100^(30)11110
這時候,b就=01010(二進位)
01010(二進位)=10
也就是說,我們現在的b=10,a=30
第三行:a^=b;(此時a=30,b=10)
一樣,我們把這行拆開來,
a^=b 等於 a=a^b;
30 =11110
10 =01010
a=11110^01010
所以 a=10100
變成10進位的話就是20
其實寫法看各人,但是如果是我的話,基本上我還是喜歡用下面的寫法,
比較清楚也比較快。
接下來,我們來談談工作實例吧,
在什麼時候我們會使用到位元運算來操作。
首先,我先分享一個我寫的define+一個struct
typedefstructtRdpConnectionINFO
{
RDP_LOCAL_FEATURE LocalFeature ;
}RDPCONNECTIONINFO,*PRDPCONNECTIONINFO;
typedefUINT8 RDP_LOCAL_FEATURE;
#defineRDP_FEATURE_AUDIO 0x01
#defineRDP_FEATURE_MIRCOPHONE 0x02
#defineRDP_FEATURE_USB_DEVICES 0x04
#defineRDP_FEATURE_H264 0x08
#defineRDP_FEATURE_ALL (RDP_FEATURE_AUDIO|RDP_FEATURE_MIRCOPHONE|RDP_FEATURE_USB_DEVICES|RDP_FEATURE_H264)
這個define是在意思是說,這個產品有沒有打開這些功能,
假如說有的話,就是最後一個全部|起來,
也就是說,我在判斷這個產品有沒有打開這些能力,我只需要去這樣寫
RDPCONNECTIONINFOinfo={0};
/*
假設我們只有打開
RDP_FEATURE_AUDIO 0x01
RDP_FEATURE_H264 0x08
這兩個flag
則我們會這樣
info.LocalFeature=RDP_FEATURE_AUDIO|RDP_FEATURE_H264;
則info.LocalFeature=0x9
然後我們將這筆資料,送上去給上層,於是上層就可以寫以下的代碼去判斷,這個產品有支援什麼東西。
*/
if(info.LocalFeature==RDP_FEATURE_ALL)
{
//這樣代表全部都開起
}
else
{
if(info.LocalFeature&RDP_FEATURE_AUDIO)
{
/*
0x9&0x1=0x1//所以會進到這個判斷
*/
}
if(info.LocalFeature&RDP_FEATURE_MIRCOPHONE)
{
/*
0x9&0x2=0x0//所以不會進到這個判斷
*/
}
if(info.LocalFeature&RDP_FEATURE_USB_DEVICES)
{
/*
0x9&0x4=0x0//所以不會進到這個判斷
*/
}
if(info.LocalFeature&RDP_FEATURE_H264)
{
/*
0x9&0x8=0x8//所以會進到這個判斷
*/
}
如此一來,我們就可以針對產品不同的能力,
去做個別的事情,其實這是一種寫法,當然我也有看過另外一種方式:
typedefstructtRdpConnectionINFO
{
BOOLFEATURE_AUDIO ;
BOOLFEATURE_MIRCOPHONE;
BOOLFEATURE_USB_DEVICES ;
BOOLFEATURE_H264 ;
}RDPCONNECTIONINFO,*PRDPCONNECTIONINFO;
這種方式也...................可以,
只是......功力高下....立刻判斷而已。
這是這一篇的教學和分享,
以後如果時間允許的話,我會盡可能的以這種方式來寫作看看,
一樣,如果各位看官有更好更快的方式,
請不要吝嗇的與我分享,
謝謝。
全站熱搜
創作者介紹
Eric
一個小小工程師的心情抒發天地
Eric發表在痞客邦留言(2)人氣()
E-mail轉寄
全站分類:收藏嗜好個人分類:[技術分享]此分類上一篇:[教學]C++ToLowerCase
此分類下一篇:[教學]C++IslandPerimeter
上一篇:[教學]C++ToLowerCase
下一篇:[教學]C++IslandPerimeter
歷史上的今天
2019:[分享]7-11CITYCAFE咖啡熱量表
▲top
留言列表
發表留言
月曆
«
七月2022
»
日
一
二
三
四
五
六
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
最新文章
文章分類
Driver(0)
Linux(2)
Ubuntu(1)[Driver](2)
AI(1)
[AI](2)
Qt(1)
[教學](6)
C#(2)
[影像處理](15)[UniversalWindowsPlatform(UWP)](3)
Python(1)
Python(41)
Java的那一點事(1)
Eclipse(4)
C/C++/MFC/COM(2)
[技術分享](124)設計模式(DesignPattern)(3)
心得分享(1)
[技術心得](20)
雜七雜八(1)
[亂七八糟分享](16)
網路相關(2)
[技術分享](10)[JavaScript](16)
心情抒發(1)
[心情雜記](30)
Driver(4)未分類文章(1)
熱門文章
參觀人氣
本日人氣:
累積人氣:
誰來我家
我的好友
最新留言
文章精選
文章精選
2022七月(2)
2022六月(12)
2022五月(3)
2022四月(3)
2022二月(1)
2022一月(3)
2021十月(1)
2021八月(1)
2021七月(2)
2021六月(1)
2021五月(3)
2020十二月(1)
2020十月(1)
2020九月(6)
2020八月(2)
2020六月(8)
2020五月(9)
2020四月(1)
2020三月(5)
2020二月(1)
2019十二月(2)
2019十一月(2)
2019十月(3)
2019九月(1)
2019八月(4)
2019七月(2)
2019六月(3)
2019五月(5)
2019四月(4)
2019三月(7)
2019二月(2)
2019一月(4)
2018十二月(12)
2018十一月(10)
2018十月(7)
2018九月(4)
2018八月(4)
2018七月(10)
2018六月(20)
2018五月(7)
2018四月(6)
2018三月(14)
2018二月(4)
2018一月(4)
2017十二月(6)
2017十一月(3)
2017十月(2)
2017九月(17)
2017八月(10)
2017七月(10)
2017六月(4)
2017五月(5)
2017四月(6)
2017三月(7)
2017二月(6)
2017一月(5)
2016十二月(5)
2016十一月(2)
2016十月(3)
所有文章列表
{{article.user_name}}
{{article.timestamp*1000|date:'MMM.dd.y.hh.mm'}}
{{article.title}}
{{article.content}}
我要留言
回到頁首
回到主文
免費註冊
客服中心
痞客邦首頁
©2003-2022PIXNET
關閉視窗
PIXNET
Facebook
Yahoo!
Google
MSN
{{guestName}}
(登出)
您尚未登入,將以訪客身份留言。
亦可以上方服務帳號登入留言
請輸入暱稱(最多顯示6個中文字元)
請輸入標題(最多顯示9個中文字元)
請輸入內容(最多140個中文字元)
請輸入左方認證碼:
看不懂,換張圖
請輸入驗證碼
送出留言
延伸文章資訊
- 1位元運算子 - C++語言自學手冊
位元運算子. 在電腦中,數字都是以0/1二進位的方式編碼,像是生活中的5、87等數字,在電腦裡面則表示成以下樣貌(以7 bits為範例):.
- 2邏輯運算、位元運算 - OpenHome.cc
在邏輯上有所謂的「且」、「或」與「反」運算,在C++ 提供這幾個基本邏輯運算所需的邏輯運算子(Logical operator),分別為「且」(&&)、「或」(||)及「反相」(!)
- 3C 位元運算子
深入瞭解:C 位運算子. ... 位元運算子的運算元必須是整數類型,但其類型可以不同。 這些運算子會執行一般算術轉換; ... 深入瞭解:C 和C++ 整數限制 ...
- 4Bit - 演算法筆記
C/C++ 的位元運算子: << 、 >> 、 & 、 | 、 ^ 、 ~ ,可以修改變數的位元。 UVa 10469 10264. Bitwise Left Shift << Bitwise ...
- 5[教學]C++ 超詳細位元運算+工作實例
位元運算子(Bitwise operator) ,在數位設計上面有AND , OR , NOT , XOR 與補數..等運算,而在C++中,提供這些運算的就是位元運算子,而它們在程式 ...