宏定义设置x二进制序列的第n个比特位为1或者0

简介: 宏定义设置x二进制序列的第n个比特位为1或者0

      今天我们来聊一聊如何定义一个宏来设置x二进制序列的第n个比特位为1或者0。


首先我们来实现设置第n个比特位为1,其他位置不变。



代码如下:


#define set_bit_to_one(x,n) (x|(1<<(n-1)))
void show(int x)
{
  int i = 0;
  for (i = 31; i >= 0; i--)
  {
    printf("%d ", (x >> i)&1);
  }
  printf("\n");
}
int main()
{
  int x = 0;
  set_bit_to_one(x, 10);
  show(x);
  return 0;
}


   但是,如果你 直接运行这样的一份代码,会得到下面的这个结果,显然,这个结果不是我们想要的,因为它并没有把第5个比特位的0改为1,那这是什么原因呢?



  其实这个毛病也是很多C语言的新手的一个通病,我们知道,a=10,a+10的结果虽然是10,但是a依旧还是a,a本身的值并没有发生变化,而这里的按位或运算也一样,x |(1<<(n-1))并没有改变x的值,所以打印出来的x还是0,所以我们应该这样更改


修改前:



修改后:



#define set_bit_to_one(x,n) (x|=(1<<(n-1)))
void show(int x)
{
  int i = 0;
  for (i = 31; i >= 0; i--)
  {
    printf("%d ", (x >> i)&1);//打印每一个比特位的数据,0&1=0,1&1=1,所以&操作符不影响
                                  //该位置原来的结果。
  }
  printf("\n");
}
int main()
{
  int x = 0;
  set_bit_to_one(x, 5);
  show(x);
  return 0;
}


设置第n个比特位为0,其他位置不变:



#define set_bit_to_zero(x,n) (x&=(~(1<<(n-1))))
void show(int x)
{
  int i = 0;
  for (i = 31; i >= 0; i--)
  {
    printf("%d ", (x >> i)&1);
  }
  printf("\n");
}
int main()
{
  int x = -1;
  set_bit_to_zero(x, 5);
  show(x);
  return 0;
}


相关文章
|
9月前
|
前端开发 JavaScript C++
Marp 教程:实现幻灯片的交互性
Marp 是一个基于 Markdown 的幻灯片制作工具,结合 VSCode 的强大编辑功能,可以让你的 PPT 制作过程更加高效和专业。本教程详细介绍了如何在 Marp 中嵌入 HTML 和 JavaScript,实现幻灯片的交互性,包括基本的按钮点击、动态内容、表单交互、幻灯片导航、动画效果和交互式图表等。通过这些技巧,你可以制作出更加生动、互动性强的演示文稿。
370 0
|
安全 Linux 开发者
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
729 1
|
机器学习/深度学习 算法 数据挖掘
算法金 | K-均值、层次、DBSCAN聚类方法解析
**摘要:** 这篇文章介绍了聚类分析的基本概念和几种主要的聚类算法。聚类是无监督学习中用于发现数据内在结构的技术,常用于市场分析、图像分割等场景。K-均值是一种基于划分的算法,简单高效但易受初始值影响;层次聚类包括凝聚和分裂方式,形成层次结构但计算复杂;DBSCAN基于密度,能处理任意形状的簇,但参数选择敏感。文章还讨论了这些算法的优缺点和适用场景,并提供了相关资源链接和Python实现。
379 9
算法金 | K-均值、层次、DBSCAN聚类方法解析
|
监控 前端开发 开发者
前端代码规范 - 日志打印规范
前端代码规范 - 日志打印规范
|
Python
Pycharm为Python项目配置环境不生效,解决办法
在PyCharm中,项目依赖配置更改后未生效。解决步骤包括:1) 查找`C:\Users\username\AppData\Roaming\JetBrains\PyCharm2022.2\options\jdk.table.xml`,2) 删除`&lt;jdk&gt;&lt;/jdk&gt;`标签内的旧配置内容,然后重启PyCharm以应用新目录。
1292 0
Pycharm为Python项目配置环境不生效,解决办法
技术心得:对数周期幂率模型(LPPL)
技术心得:对数周期幂率模型(LPPL)
454 3
|
监控 Linux 数据处理
lslocks:Linux系统中的锁信息查看利器
`lslocks`是Linux工具,用于查看系统上的文件锁信息,帮助诊断进程同步问题。它显示持有锁的进程、锁类型(如POSIX、flock)和状态。通过简洁的输出,用户能识别死锁和资源争用,优化性能。结合其他命令如`grep`和`awk`可增强分析能力。需适当权限运行,定期监控以预防并发访问问题,处理死锁时要谨慎。
|
机器学习/深度学习 存储 大数据
大数据时代的处理挑战与突破
随着数字化时代的到来,大数据已经成为了企业和组织获取商业价值的关键资源。然而,大规模数据处理也带来了很多挑战,如数据量巨大、数据质量不一、处理效率低下等。本文将探讨大规模数据处理所面临的挑战,并介绍几种处理大规模数据的方法和技术,包括分布式系统、基于内存的计算、图形数据库、NoSQL数据库和机器学习算法等。同时,本文还将重点介绍近年来在大规模数据处理领域中的突破,如深度学习、人工智能等技术的应用。
451 1
|
自然语言处理 Java 测试技术
使用PostMan请求阿里云通义千问大模型
本文介绍如果通过postman调用阿里云通义千问API,然后介绍如果使用多语言集成,最后介绍了快速使用postman压测创建的API请求。
3178 2
|
语音技术
如何在GitHub正确提PR(Pull Requests),给喜欢的开源项目贡献代码
最好的中文TTS项目Bert-vits2更新了中文特化分支,但可能由于时间仓促,代码中存在不少的bug,作为普通用户,有的时候也想为自己喜欢的开源项目做一点点贡献,帮助作者修改一些简单的bug,那么该如何开始? 本次我们以Bert-vits2项目为例子,分享正确提交PR(Pull Requests)的方式。