交换奇偶位:交换一个整数的二进制的奇偶位置(仅考虑正数情况)

方法二:

设计思想:

     0xAAAAAAAA 的二进制表示为 10101010...(从最低位开始)
     0x55555555 的二进制表示为 01010101...(从最低位开始)

交换奇偶位:交换一个整数的二进制的奇偶位置(仅考虑正数情况)_第1张图片

问题:更加想不到掩码!!!!!!!!!!!!

方法一:

设计思想:

     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就会在每次循环后保存所有已处理的偶数/奇数位

交换奇偶位:交换一个整数的二进制的奇偶位置(仅考虑正数情况)_第2张图片

问题:

想不到!根本想不到!!!!!!!!!

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;
}

你可能感兴趣的:(算法,数据结构,开发语言,c语言)