使用C語(yǔ)言實(shí)現(xiàn)交換整數(shù)的奇數(shù)位和偶數(shù)位
一、問(wèn)題描述
使用C語(yǔ)言代碼實(shí)現(xiàn):將一個(gè)整數(shù)的奇數(shù)位和偶數(shù)位交換
二、解決思路
在C語(yǔ)言中,要交換一個(gè)整數(shù)的二進(jìn)制位中的奇數(shù)位和偶數(shù)位,重點(diǎn)需要理解位操作。
當(dāng)我們談?wù)摱M(jìn)制位的奇數(shù)位和偶數(shù)位時(shí),我們是指從右到左(或從最低位到最高位)數(shù)的位置。在這種計(jì)數(shù)方式下,第一位是奇數(shù)位,第二位是偶數(shù)位,依此類推。
1. 首先,分別取出奇數(shù)位和偶數(shù)位,(此處默認(rèn)整數(shù)是4字節(jié),也就是32位二進(jìn)制位)
- 將整數(shù)與01010101010101010101010101010101(寫(xiě)成十六進(jìn)制是0x55555555)進(jìn)行按位與&運(yùn)算,即可得到原整數(shù)的奇數(shù)位
- 將整數(shù)與10101010101010101010101010101010(寫(xiě)成十六進(jìn)制是0xaaaaaaaa)進(jìn)行按位與&運(yùn)算,即可得到原整數(shù)的偶數(shù)位
2. 然后,將奇數(shù)位和偶數(shù)位的位置邊換
- 將上一步得到的整數(shù)的奇數(shù)位,左移<<一位,即可將奇數(shù)位變換到偶數(shù)位的位置上
- 將上一步得到的整數(shù)的偶數(shù)位,右移>>一位,即可將奇數(shù)位變換到偶數(shù)位的位置上
3. 上一步分別左移右移之后,將奇數(shù)位和偶數(shù)位變換了位置,接下來(lái)將兩個(gè)結(jié)果進(jìn)行按位或 | 運(yùn)算,即可將奇數(shù)位和偶數(shù)位合并在一起,完成轉(zhuǎn)換
三、函數(shù)實(shí)現(xiàn)
#include<stdio.h>
int Exchange(int n)
{
int a = n & 0x55555555;
int b = n & 0xaaaaaaaa;
a <<= 1;
b >>= 1;
return (a | b);
}
int main()
{
int a = 11;
int b = 13;
printf("%d\n", Exchange(a));
printf("%d\n", Exchange(b));
return 0;
}
四、宏實(shí)現(xiàn)
#include<stdio.h>
#define Exchange(n) ((((n)&0x55555555)<<1)| (((n)&0xaaaaaaaa)>>1))
int main()
{
int a = 11;
int b = 13;
printf("%d\n", Exchange(a));
printf("%d\n", Exchange(b));
return 0;
}
五、總結(jié)
在C語(yǔ)言中,要交換一個(gè)整數(shù)的二進(jìn)制位中的奇數(shù)位和偶數(shù)位,重點(diǎn)需要理解位操作。
使用函數(shù)和宏都可以實(shí)現(xiàn)該代碼。對(duì)于此類較短較簡(jiǎn)單的代碼,因?yàn)楹曛皇呛?jiǎn)單的文本替換,所以省去了函數(shù)調(diào)用和返回的時(shí)間和空間開(kāi)銷,所以效率更高一些。
不過(guò)要注意的一點(diǎn)是,因?yàn)楹晔俏谋咎鎿Q,所以運(yùn)算時(shí)可以會(huì)因?yàn)閮?yōu)先級(jí)導(dǎo)致一些問(wèn)題,保險(xiǎn)起見(jiàn),需要在可以會(huì)出現(xiàn)問(wèn)題的表達(dá)式兩邊都加上括號(hào)。
以上就是使用C語(yǔ)言實(shí)現(xiàn)交換整數(shù)的奇數(shù)位和偶數(shù)位的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言交換整數(shù)的奇數(shù)位和偶數(shù)位的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例
這篇文章主要介紹了C語(yǔ)言中函數(shù)參數(shù)的入棧順序詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02
淺析char 指針變量char *=p 這個(gè)語(yǔ)句的輸出問(wèn)題
下面小編就為大家?guī)?lái)一篇淺析char 指針變量char *=p 這個(gè)語(yǔ)句的輸出問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
C++實(shí)現(xiàn)LeetCode(148.鏈表排序)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(148.鏈表排序),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C++ Boost Chrono實(shí)現(xiàn)計(jì)時(shí)碼表流程詳解
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開(kāi)發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱2022-11-11
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法基礎(chǔ)之循環(huán)隊(duì)列示例
這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法基礎(chǔ)之循環(huán)隊(duì)列,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
詳解C/C++ Linux出錯(cuò)處理函數(shù)(strerror與perror)的使用
我們知道,系統(tǒng)函數(shù)調(diào)用不能保證每次都成功,必須進(jìn)行出錯(cuò)處理,這樣一方面可以保證程序邏輯正常,另一方面可以迅速得到故障信息。本文主要為大家介紹兩個(gè)出錯(cuò)處理函數(shù)(strerror、perror)的使用,需要的可以參考一下2023-01-01
Qt結(jié)合libqrencode生成二維碼的實(shí)現(xiàn)示例
本文主要介紹了Qt結(jié)合libqrencode生成二維碼的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
C++對(duì)象內(nèi)存分布詳解(包括字節(jié)對(duì)齊和虛函數(shù)表)
下面小編就為大家?guī)?lái)一篇C++對(duì)象內(nèi)存分布詳解(包括字節(jié)對(duì)齊和虛函數(shù)表)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12

