鮮花加盟網(wǎng)站建設(shè)網(wǎng)站優(yōu)化與seo
方法二:
設(shè)計思想:
?????0xAAAAAAAA 的二進(jìn)制表示為 10101010...(從最低位開始)
?? ? 0x55555555 的二進(jìn)制表示為 01010101...(從最低位開始)
問題:更加想不到掩碼!!!!!!!!!!!!
方法一:
設(shè)計思想:
?? ? 1.在32位bit的二進(jìn)制中,遍歷每個字節(jié),分別找出num的奇偶數(shù)
?? ?(1)偶數(shù)num=2*i(i=0),奇數(shù)num=2*i+1(i=0)
?? ?(2)將數(shù)字“1”分別左移偶/奇對應(yīng)的位置,再和num相與,即可得到num二進(jìn)制上的偶/奇數(shù)
?? ? 2.奇偶交換實現(xiàn)
?? ?(1) (num & (1 << (2 * i))):意味著找到了num上的奇/偶數(shù)
?? ?(2)(移動一位)將偶數(shù)左移、奇數(shù)右移,或者將偶數(shù)右移、奇數(shù)右移,都可以實現(xiàn)奇偶數(shù)字相互交換
?? ?(3)交換結(jié)果【或運算】被添加到ou/ji中,這樣ou/ji就會在每次循環(huán)后保存所有已處理的偶數(shù)/奇數(shù)位
問題:
想不到!根本想不到!!!!!!!!!
void swap(int num)
{int ou = 0; //用一個整數(shù)存儲偶數(shù)位int ji = 0; //用一個整數(shù)存儲奇數(shù)位//方法二ou = num & 0xAAAAAAAA;//掩碼:獲取所有偶數(shù)位ji = num & 0x55555555;ou >>= 1;//右移偶數(shù)位,左移奇數(shù)位ji <<= 1;//方法一//int i = 0;//for (i = 0; i < 32; i++)//{// ou |= (num & (1 << (2 * i))) << 1; //將偶數(shù)位左移一位后與ou進(jìn)行或運算// ji |= (num & (1 << (2 * i + 1))) >> 1; //將奇數(shù)位右移一位后與ji進(jìn)行或運算//}num = ou | ji; //將偶數(shù)位和奇數(shù)位進(jìn)行或運算,得到交換后的結(jié)果printf("%d\n", num);
}
int main()
{int num = 5;swap(num);return 0;
}