欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C生萬物C語言宏將整數(shù)二進制位的奇偶數(shù)位交換

 更新時間:2023年02月09日 09:57:56   作者:Fire_Cloud_1  
這篇文章主要為大家介紹了C生萬物C語言使用宏將整數(shù)二進制位的奇偶數(shù)位交換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

?題目分析 && 實現(xiàn)思路[位運算]

首先來說一下本題的實現(xiàn)思路??

  • 本題不僅是要使用宏來是實現(xiàn),而且還要對一個數(shù)的二進制位進行操作,所以我們就可以想到位運算

1、獲取這個整數(shù)的奇數(shù)位和偶數(shù)位

  • 因為需要交換的是這個整數(shù)二進制位的【奇數(shù)位】和【偶數(shù)位】,因此我們要先獲取到它們,這里要使用到一個很巧妙的手法,可以將這個數(shù)的奇偶位分別保存下來,就要用到在十六進制中很奇特的兩個數(shù)——>==5 和 a== ;因為5寫成二進制的形式為0101,1均在奇數(shù)位上。a寫成二進制的形式為1010,1均在偶數(shù)位上
  • 對于一個數(shù)來說可以分為32個比特位,所以我們就需要8個5和8個a,將它們展開后就是0x555555550、0xaaaaaaaa;所以將這個整數(shù)與前者進行【&】運算便可以保留下它的奇數(shù)位;這個整數(shù)與后者進行【&】運算便可以保留下它的偶數(shù)位
  • 按位與的運算規(guī)則是==全1才為1,有0即為0==

2、使用移位運算使【奇變偶】【偶變奇】

  • 在我們獲取到奇數(shù)位和偶數(shù)位之后,就完成了第一步。接著去我們就可以將去交換奇數(shù)位和偶數(shù)位了,但是直接做整體的交換太麻煩了,也很難做到。既然在上一步中分別保留了奇數(shù)位和偶數(shù)位,那不妨分別對他們進行操作。
  • 對于奇數(shù)位來說,要將他們整體變?yōu)榕紨?shù)位,就需要一個整體左移的操作,我們可以使用移位運算符<<
  • 對于偶數(shù)位來說,要將他們整體變?yōu)槠鏀?shù)位,就需要一個整體右移的操作,我們可以使用移位運算符>>
  • 移位運算的運算規(guī)則是==左移表示÷2,右移表示×2==

3、合并奇數(shù)位和偶數(shù)位

  • 進行移位操作之后,奇變偶、偶變奇也就相當于做了一次交換的操作,但是它們兩個是一個獨立的個體,并不完整,因此我們要將他們做一個拼接,這里我們使用到的又是另一個位運算符【|】按位或
  • 按位或的運算規(guī)則是==只要有1即為1,全0才位0==

?代碼分析

1、代碼展示

看完整體的思路之后,相信你對本題一定有了大致的方向,我們將上述的思路轉化為代碼 如果對宏定義不太清楚的可以看看這篇文章——> C生萬物 | 詳解程序環(huán)境和預處理

#define SWAP(n) num = (((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1))
int main(void)
{
	int num = 36;
	int ret = SWAP(num);
	printf("num = %d\n", num);
	return 0;
}
  • 首先的一點就是對于【宏】來說它和函數(shù)不一樣是它不需要聲明類型,也沒有復雜的函數(shù)體,直接給出運算規(guī)則即可
  • 所以你可以看到,我寫的這個宏就是我在上面所說的思路轉化為的代碼。不過很重要的一點是寫宏的時候一定要加足括號,因為對于宏來說在預編譯階段就會直接進行替換,若是沒有加括號的話可能會導致出現(xiàn)優(yōu)先級的問題

來看看運行結果吧??

2、算法圖解分析

再通過畫圖來分析一下,就看得更清楚了

首先就是第一步,分別取出奇數(shù)位和偶數(shù)位

  • 然后進行移位操作,使奇變偶、偶變奇

  • 最后再將32為的奇偶分列進行一個合并

??可以看到最后的結果就是我們程序的執(zhí)行結果【24】

??總結與提煉

總結一下本文所學習到的內容

本篇文章雖然講解的內容并不多,但是攻克了一道難題,雖然宏的代碼看起來比較簡潔,但是要想到還是需要一些時間的。如果我們在寫程序的時候能夠巧妙地運用宏去進行解決,就能事半而功倍

以上就是C生萬物使用宏將整數(shù)二進制位的奇偶數(shù)位交換的詳細內容,更多關于C 宏整數(shù)二進制奇偶數(shù)位交換的資料請關注腳本之家其它相關文章!

相關文章

  • C++?Boost?Format超詳細講解

    C++?Boost?Format超詳細講解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • Qt+Live555搭建RTSP服務器的方法步驟

    Qt+Live555搭建RTSP服務器的方法步驟

    本文主要介紹了Qt+Live555搭建RTSP服務器的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • C++ assert()函數(shù)用法案例詳解

    C++ assert()函數(shù)用法案例詳解

    這篇文章主要介紹了C++ assert()函數(shù)用法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • C語言連接并操作Sedna XML數(shù)據(jù)庫的方法

    C語言連接并操作Sedna XML數(shù)據(jù)庫的方法

    這篇文章主要介紹了C語言連接并操作Sedna XML數(shù)據(jù)庫的方法,實例分析了C語言操作XML文件的相關技巧,需要的朋友可以參考下
    2015-06-06
  • C++ main函數(shù)的幾點細節(jié)

    C++ main函數(shù)的幾點細節(jié)

    這篇文章主要介紹了C++ main函數(shù)的幾點細節(jié),幫助大家更好的理解和學習C++,感興趣的朋友可以了解下
    2020-08-08
  • C++實現(xiàn)俄羅斯方塊(linux版本)

    C++實現(xiàn)俄羅斯方塊(linux版本)

    這篇文章主要為大家詳細介紹了linux版本C++實現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • c語言在控制臺判定鼠標左鍵的小例子

    c語言在控制臺判定鼠標左鍵的小例子

    c語言在控制臺判定鼠標左鍵的小例子,需要的朋友可以參考一下
    2013-06-06
  • 老生常談C語言中指針的使用

    老生常談C語言中指針的使用

    這篇文章主要為大家詳細介紹了C語言中指針的使用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • OpenCV實現(xiàn)簡單錄屏功能

    OpenCV實現(xiàn)簡單錄屏功能

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)簡單錄屏功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C++?Queue隊列類模版實例詳解

    C++?Queue隊列類模版實例詳解

    這篇文章主要為大家詳細介紹C++?Queue隊列類模版實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論