第六十九题→将一个整数的二进制位的奇数和偶数进行交换。

136 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情

🚩write in front🚩   

🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎

🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 阿里云星级博主~掘金⇿InfoQ~51CTOP创作者(创作新人榜No.38)~[CSDN]周榜102﹣总榜826 ⇿ 全网访问量35w+🏅

🆔本文由 謓泽 原创 发布在51CTOP 如需转载还请通知⚠

📝个人主页-謓泽 的个人主页 - 文章 - 掘金 (juejin.cn)📃

🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝

📣系列专栏-【C语言】Topic - 謓泽的专栏 - 掘金 (juejin.cn)🎓

✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本📩 ​

 🍊第六十九题→将一个整数的二进制位的奇数和偶数进行交换🍊 

🤔题解思路如下👇
每日名言-有多大的思想,才有多大的能量。
⒈题目的本质。

说明⇢整数的二进制做到奇数和偶数的交换,调用自定义函数fun()实现功能。

㈠假设我们所输入的数字为⑩,它的二进制形式如下⇲

0000 0000 0000 0000 0000 0000 0000 1010

㈡首先是将二进制的奇数和偶数进行交换,那么上面数字的交换形式如下⇲

0000 0000 0000 0000 0000 0000 0000 0101

说明⇢从上述说明可以知道它是进行了交换的,并且还按位右移了①位。那么我们怎么样才能获得这个偶数位呢,实际上这个并不难的。

㈢假设法用数字⑩来进行,如下图所示⇲

n & 0xaaaaaaaa 规律⇢全部与上二进制的偶数位、注-①字节等于③②bit
0&0=0;     0&1=0;     1&0=0;     1&1=1;
按位右移动>>1

END-那么总结一下得到偶数位,然后再进行二进制位的奇数和偶数进行交换如下代码⇲

int even = ((n & 0xaaaaaaaa) >> 1);

说明⇢那么以上就达到了输入位为偶数位的二进制交换结果不知道你明白了没有,好好梳理总结下吧(^▽^)

拓展-这里大家也可以思考下奇数位的二进制交换结果的方式。 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> int fun(int n) { //偶数,当n为偶数的时候向右移动一位。 int even = ((n & 0xaaaaaaaa) >> 1); //奇数,当n为奇数的时候向左移动一位。 int odd = ((n & 0x55555555) << 1); //相加在一起最终返回sum int sum = even + odd; return sum; } int main(void) { int num = 0; printf("Please key in numbers:"); scanf("%d", &num); int ret = fun(num); printf("result:%d\n", ret); return 0; }

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int fun(int n)
{
	//偶数,当n为偶数的时候向右移动一位。
	int even = ((n & 0xaaaaaaaa) >> 1);
	//奇数,当n为奇数的时候向左移动一位。
	int odd =  ((n & 0x55555555) << 1);
	//相加在一起最终返回sum
	int sum = even + odd;
	return sum;
}
int main(void)
{
	int num = 0;
	printf("Please key in numbers:");
	scanf("%d", &num);
	int ret = fun(num);
	printf("result:%d\n", ret);
	return 0;
}

运行结果🖋 Please key in numbers:5
result:10