宏定义设置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;
}


相关文章
|
6月前
二进制中1的个数
二进制中1的个数
36 0
|
5月前
实现offsetof宏以及交换一个整数二进制奇偶位的宏
实现offsetof宏以及交换一个整数二进制奇偶位的宏
20 0
实现offsetof宏以及交换一个整数二进制奇偶位的宏
|
5月前
|
C语言
C语言----获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
C语言----获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
|
6月前
|
C++
Acwing.26 二进制中1的个数
Acwing.26 二进制中1的个数
|
6月前
|
C语言
【C语言】求一个整数的二进制序列中1的个数的三种方法
【C语言】求一个整数的二进制序列中1的个数的三种方法
96 0
|
6月前
|
C语言
[C语言][题]获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
[C语言][题]获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
46 0
|
存储 人工智能 编译器
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
467 0
|
存储 C语言
探索编程中的字母转换:如何将字母变为二进制矩阵?
二进制是学习计算机语言中一个非常重要的知识点,笔者将通过这篇文章帮助读者了解进制转换在程序中的运用,借助进制转化实现火柴形状的字母输出。
146 0
|
算法 C语言
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
|
C语言
【C】替换空格,宏实现整数的二进制奇偶位交换
【C】替换空格,宏实现整数的二进制奇偶位交换
64 0
【C】替换空格,宏实现整数的二进制奇偶位交换