【C语言】宏实现一个整数的二进制位的奇数位和偶数位交换

这篇具有很好参考价值的文章主要介绍了【C语言】宏实现一个整数的二进制位的奇数位和偶数位交换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

要写一个宏实现将一个整数的二进制位的奇数位和偶数位交换,我们首先要分析如何将一个整数的二进制位的奇数位和偶数位交换

以下以整数7为例

7的二进制:

0000 0000 0000 0000 0000 0000 0000 0111  7

奇数位与偶数位交换后为:

0000 0000 0000 0000 0000 0000 0000 1011  11

📖分析:

交换奇数位和偶数位可以分为两步:

1️⃣奇数位放到偶数位

实现如下:

奇数位不变,偶数位置0,整体左移一位

偶数位置0:0000 0000 0000 0000 0000 0000 0000 0101

左移一位:  0000 0000 0000 0000 0000 0000 0000 1010 

此时,已将所有奇数位移动到了偶数位上

2️⃣偶数位放到奇数位

偶数位不变,奇数位置0,整体右移一位

偶数位置0:0000 0000 0000 0000 0000 0000 0000 0010

右移一位:  00000 0000 0000 0000 0000 0000 0000 001

此时,已将所有偶数位移动到了奇数位上

如何将所有偶数位/奇数位置0:

偶数位置零:

0&任何数都为0,所以给所有偶数位&0,为了保证奇数位不变,给所有奇数位&1

所以偶数位置0只需要给原数&10101010 10101010 10101010 10101010

即十六进制数:0x aaaaaaaa

同理,奇数位置0:

给原数& 01010101 01010101 01010101 01010101

即十六进制数:0x 55555555

📖Note:

如何判断左移还是右移?

从最低位看,最低位为一个奇数位,次低位为偶数位,交换时,最低位与次低位交换

奇数位放到偶数位时:即最低位放到次低位上,为向左移

偶数位放到奇数位时:即次低位放到最低位上,为向右移

奇数位移动: 0000 0000 0000 0000 0000 0000 0000 1010 

偶数位移动: 00000 0000 0000 0000 0000 0000 0000 001

奇数位与偶数位的分别操作之后,如何整合?

两次操作得到的数据相加即可;

进行奇数位的操作时,偶数位全被置为0,奇数位的数据有效

进行偶数位的操作时,奇数位全被置为0,偶数位的数据有效

实现:

#include<stdio.h>
#define SWAP(n) (((n&0xaaaaaaaa)>>1) + ((n&0x55555555)<<1))

int main()
{
	int n = 7;
	int m = SWAP(n);
	printf("%d %d\n", n, m);

	return 0;
}

【C语言】宏实现一个整数的二进制位的奇数位和偶数位交换

📖Note:

左移操作符会改变变量本身的值,但是#define定义的宏在预处理阶段完成替换,即在预处理阶段#define定义的宏中,n都被替换成7,先替换再计算时,n的值并不会被改变,也不会影响计算结果文章来源地址https://www.toymoban.com/news/detail-445714.html

到了这里,关于【C语言】宏实现一个整数的二进制位的奇数位和偶数位交换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言每日一题(5):求两个数二进制中不同位的个数

    文章主题:求两个数二进制中不同位的个数🔥 所属专栏: C语言每日一题 📗 作者简介:每天不定时更新C语言的小白一枚,记录分享自己每天的所思所想😄🎶 个人主页: [₽]的个人主页 🏄🌊 最近刚学位操作符以及二进制码的相关知识,于是想出了求两个数二进制中不同

    2024年02月07日
    浏览(152)
  • C语言:二进制、八进制、十六进制整数的书写及输出

    目录 一、整型数据类型 二、二进制、八进制、十六进制的书写 1)二进制 以 0b / 0B 开头,不区分大小写(数字0,而非字母o,下同) 2)八进制 以数字 0 开头         3)十六进制 以 0x / 0X 开头, 三、二进制、八进制和十六进制的输出 八进制   (%o): 十六进制   (%x):

    2024年02月05日
    浏览(69)
  • C语言每日一题之整数求二进制1的个数

    今天分享一道题目,用三种方法来求解 二进制1的个数 方法1 我们的十进制除10和取余数就可以得到我们每一位的数字,那我们的二进制也可 以 这是一种方法,另外一种就是我们可以用移位操作符来算 这个方法是不是也是特别妙呢,当然还有更妙的方法,请看!!! 相信看

    2024年02月15日
    浏览(62)
  • 写一个函数返回参数二进制中 1 的个数(c语言三种实现方法)

    (本文旨在自己做题时的总结,我会给出不同的解法,后面如果碰到新的题目还会加入其中,等于是我自己的题库。 方法一: 方法二: 这里说一个方法,任何一个进制数%它的进制位都可以得到它的最低位,任何一个进制数 / 它的进制位都可以将最低位丢弃。比如: 这样我

    2024年02月13日
    浏览(50)
  • [保研/考研机试] KY30 进制转换-大整数转二进制 清华大学复试上机题 C++实现

    将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。 输入描述: 多组数据,每行为一个长度不超过30位的十进制非负整数。 (注意是10进制数字的个数可能有30个,而非30bits的整数) 输出描述: 每行输出对应的二进制数。 仍然是“除2取余法”,主要的区别在

    2024年02月13日
    浏览(86)
  • 二进制链表转整数

    给你一个单链表的引用结点 head 。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1: 示例 2: 示例 3: 示例 4: 示例 5: 代码如下:

    2024年02月14日
    浏览(52)
  • leetcode 1290.二进制链表转整数

    🌟 leetcode链接:二进制链表转整数 ps: 代码:

    2024年02月14日
    浏览(62)
  • 进制转换—包含整数和小数部分转换(二进制、八进制、十进制、十六进制)手写版,超详细

    目录 1.进制转换必备知识:         1.1 二进制逢2进1         8进制逢8进1           10进制逢10进1        16进制逢16进1         1.2为了区分二、八、十、十六进制,我们通常在数字后面加字母进行区分 2. 二进制与八进制、十六进制相互转换         2.1 二进制转

    2023年04月23日
    浏览(99)
  • 【进制转换】— 包含整数和小数部分转换(二进制、八进制、十进制、十六进制)手写版,超详细

    目录 1.进制转换必备知识:         1.1 二进制逢2进1         8进制逢8进1           10进制逢10进1        16进制逢16进1         1.2为了区分二、八、十、十六进制,我们通常在数字后面加字母进行区分 2. 二进制与八进制、十六进制相互转换         2.1 二进制转

    2024年02月05日
    浏览(306)
  • MATLAB练习题:编写程序将十进制正整数转换为对应的二进制字符向量

     讲解视频:可以在bilibili搜索“MATLAB教程新手入门篇——数学建模清风主讲”。 MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili  编写程序将十进制正整数转换为对应的二进制字符向量。例如6对应的二进制字符向量为\\\'110\\\', 38对应的二进制字

    2024年02月02日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包