方法二:
设计思想:
0xAAAAAAAA 的二进制表示为 10101010...(从最低位开始)
0x55555555 的二进制表示为 01010101...(从最低位开始)
问题:更加想不到掩码!!!!!!!!!!!!
方法一:
设计思想:
1.在32位bit的二进制中,遍历每个字节,分别找出num的奇偶数
(1)偶数num=2*i(i=0),奇数num=2*i+1(i=0)
(2)将数字“1”分别左移偶/奇对应的位置,再和num相与,即可得到num二进制上的偶/奇数
2.奇偶交换实现
(1) (num & (1 << (2 * i))):意味着找到了num上的奇/偶数
(2)(移动一位)将偶数左移、奇数右移,或者将偶数右移、奇数右移,都可以实现奇偶数字相互交换
(3)交换结果【或运算】被添加到ou/ji中,这样ou/ji就会在每次循环后保存所有已处理的偶数/奇数位
问题:
想不到!根本想不到!!!!!!!!!
void swap(int num)
{
int ou = 0; //用一个整数存储偶数位
int ji = 0; //用一个整数存储奇数位
//方法二
ou = num & 0xAAAAAAAA;//掩码:获取所有偶数位
ji = num & 0x55555555;
ou >>= 1;//右移偶数位,左移奇数位
ji <<= 1;
//方法一
//int i = 0;
//for (i = 0; i < 32; i++)
//{
// ou |= (num & (1 << (2 * i))) << 1; //将偶数位左移一位后与ou进行或运算
// ji |= (num & (1 << (2 * i + 1))) >> 1; //将奇数位右移一位后与ji进行或运算
//}
num = ou | ji; //将偶数位和奇数位进行或运算,得到交换后的结果
printf("%d\n", num);
}
int main()
{
int num = 5;
swap(num);
return 0;
}