學(xué)院網(wǎng)站建設(shè)規(guī)劃網(wǎng)絡(luò)服務(wù)是什么
思路分析
通過(guò)宏定義來(lái)實(shí)現(xiàn)二進(jìn)制數(shù)的奇偶位交換,如果一個(gè)個(gè)遍歷交換的話,那得算到猴年馬月,這是我在網(wǎng)上看到的一個(gè)思路:
我們將每一位(整數(shù)在計(jì)算機(jī)里存儲(chǔ)是4字節(jié),32位)二進(jìn)制數(shù)的奇數(shù)位保留,偶數(shù)位置為0,并向右移一位,這樣就實(shí)現(xiàn)奇數(shù)位換到偶數(shù)位。同樣的道理,再將偶數(shù)位保留,奇數(shù)位置為0,并左移一位實(shí)現(xiàn)偶數(shù)位到奇數(shù)位的交換。
最后將得到的兩個(gè)數(shù)加起來(lái),神奇的事情出現(xiàn)了:完成了交換(作者本人實(shí)現(xiàn)時(shí)震驚了一下,太巧妙了)。
步驟解析
1.將奇數(shù)位保留,可以利用與的思想(同1為1,有0為0),將奇數(shù)位每一位與1就保留了奇數(shù)位的值,與的值奇數(shù)位為1,偶數(shù)為置為0,0101(5),需要32位,轉(zhuǎn)換為16進(jìn)制就是0x55555555.再左移1位完成交換
2.偶數(shù)位就與1010(10),16進(jìn)制為0xaaaaaaaa。再右移一位完成交換
3.最后再相加起來(lái),就是我們需要的值。
#define _CRT_SECURE_NO_WARNINGS 1
#define change(n) (n=((n&0xaaaaaaaa)>>1)+((n&0x55555555)<<1))
#include<stdio.h>int main()
{int a = 10;change(a);printf("%d", a);return 0;}