網站首頁 編程語言 正文
?題目分析 && 實現思路[位運算]
首先來說一下本題的實現思路??
- 本題不僅是要使用宏來是實現,而且還要對一個數的二進制位進行操作,所以我們就可以想到位運算
1、獲取這個整數的奇數位和偶數位
- 因為需要交換的是這個整數二進制位的【奇數位】和【偶數位】,因此我們要先獲取到它們,這里要使用到一個很巧妙的手法,可以將這個數的奇偶位分別保存下來,就要用到在十六進制中很奇特的兩個數——>==5 和 a== ;因為5寫成二進制的形式為
0101
,1均在奇數位上。a寫成二進制的形式為1010
,1均在偶數位上 - 對于一個數來說可以分為32個比特位,所以我們就需要8個5和8個a,將它們展開后就是
0x555555550
、0xaaaaaaaa
;所以將這個整數與前者進行【&】運算便可以保留下它的奇數位;這個整數與后者進行【&】運算便可以保留下它的偶數位 - 按位與的運算規則是==全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
相關推薦
- 2022-10-30 C語言struct結構體介紹_C 語言
- 2022-07-01 iOS?DispatchSourceTimer?定時器的具體使用_IOS
- 2022-10-25 Python條件語句的使用_python
- 2023-03-16 python使用redis實現消息隊列(異步)的實現完整例程_python
- 2022-08-30 關于Flask高級_WTForms介紹和基本使用
- 2022-10-12 Docker安裝RabbitMQ的超詳細步驟_docker
- 2022-11-17 python中關于os.path.pardir的一些坑_python
- 2022-04-25 django數據庫遷移migration實現_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支