【C/C++教學】來聊聊關於C中的位運算

前言web

許多童鞋對C語言編程掌握得不錯,能夠編出一些不俗的程序。可是對於C語言中提供的位運算卻知之甚少,不多甚至不會靈活的運用。其實位運算是C語言的精髓之一,巧妙的利用位運算有時能大大的減小機器負擔,提升程序的運行效率。編程

下面讓我經過一個題目帶領你們一塊兒探究一下C中的位運算。一塊兒來搞搞事情吧!微信


題以下:測試

首先對題目做簡單說明,這裏的循環移位的意思是將右移出的位補到最左邊,例如:url

對1:spa

0000 0000 0000 0001.net


右移1位變成:3d

1000 0000 0000 0000orm


如今要解決這個問題,首先咱們須要先進行一些準備,同時也是一個預熱:寫一個輸出數據的二進制碼的方法,以下:blog

其中sum是傳入要被輸出處理的數,z是其所佔字節數

能夠看到取位值的技巧就是移相應位後與1取&,其餘在此不做過多說明。

接下來進入正題了,輸入獲取值的不做講解,直接代碼伺候:

值得注意的是:

sum爲儲存目標變換數的變量,c_sum爲移位數,z用來存儲該環境下整型所佔字節數。


再接下來就是循環移位的關鍵:怎麼個移法,怎麼個解決方案?

以下圖單純移位運算行不行呢?

咱們不妨運行測試一下:

然而,問題就出在了移位後第一位的1

那麼如何解決,不妨用個判斷語句去其首位的1,上圖:

運行結果以下:

能夠看出程序已經正確運行了!

接下來我們再詳細聊聊程序中。

If語句用以判斷數據的第一位是不是1,而若是是1的話,接下來的處理就是關鍵了,若是處理很差會致使前面所有補1甚至完全亂碼。

有不少種處理方法,正所謂條條大路通羅馬。這裏我只給出個人方法的解釋。


①先將sum右移1位,第一位會自動補1,備用;


②再將1左移到第一位,後面會所有補0,接下來取反,也就變成了0後面一堆1;


③將上一步中得的補碼與1中得的補碼&,1中補碼的第1位也就被替換成了0;


④最後取sum的最後1位右移到第一位與3中所得補碼進行|或^運算。


修修補補的工做就不過多贅述。值得注意的是程序完成後能直接AC掉這道題,能夠將測試方法bin()註釋或直接刪掉,這是一種很是好的編程技巧,能夠大大下降程序維護的難度,提升編程效率和代碼可讀性!

END

若是以爲咱們好的能夠掃下面二維碼關注一下咱們哦,不定時推送更多小文章。


編輯:華科@唐文軍

若有疑問,歡迎諮詢,聯繫QQ:1843586983


本文分享自微信公衆號 - 程序猿聲(ProgramDream)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索