日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C生萬物C語言宏將整數二進制位的奇偶數位交換_C 語言

作者:Fire_Cloud_1 ? 更新時間: 2023-04-18 編程語言

?題目分析 && 實現思路[位運算]

首先來說一下本題的實現思路??

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

1、獲取這個整數的奇數位和偶數位

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

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

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

3、合并奇數位和偶數位

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

?代碼分析

1、代碼展示

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

#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;
}
  • 首先的一點就是對于【宏】來說它和函數不一樣是它不需要聲明類型,也沒有復雜的函數體,直接給出運算規則即可
  • 所以你可以看到,我寫的這個宏就是我在上面所說的思路轉化為的代碼。不過很重要的一點是寫宏的時候一定要加足括號,因為對于宏來說在預編譯階段就會直接進行替換,若是沒有加括號的話可能會導致出現優先級的問題

來看看運行結果吧??

2、算法圖解分析

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

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

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

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

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

??總結與提煉

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

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

原文鏈接:https://juejin.cn/post/7197790401494597689

欄目分類
最近更新