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

方法二:

设计思想:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值