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


相关文章
|
4月前
二进制中1的个数
二进制中1的个数
26 0
|
3月前
实现offsetof宏以及交换一个整数二进制奇偶位的宏
实现offsetof宏以及交换一个整数二进制奇偶位的宏
18 0
实现offsetof宏以及交换一个整数二进制奇偶位的宏
|
3月前
|
C语言
C语言----获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
C语言----获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
|
4月前
|
C++
Acwing.26 二进制中1的个数
Acwing.26 二进制中1的个数
|
4月前
|
C语言
【C语言】求一个整数的二进制序列中1的个数的三种方法
【C语言】求一个整数的二进制序列中1的个数的三种方法
36 0
|
11月前
|
存储 人工智能 编译器
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
398 0
|
存储 C语言
CRC编码计算方法及C语言实现
CRC(Cyclic Redundancy Check)是一种常用的错误校验码,用于检测和纠正传输过程中的错误。在数据通信和存储中,CRC编码被广泛应用,因为它能够高效地检测错误,并且实现简便。
236 0
|
C语言
【C语言】强制指针变换,将多字节数据转成单字节数据
【C语言】强制指针变换,将多字节数据转成单字节数据
130 0
|
算法 C语言
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
10(可回看)【C语言 & 趣味算法】数制转换(常见,二进制、八进制、十进制、十六进制之间任意转换)
|
C语言
【C】替换空格,宏实现整数的二进制奇偶位交换
【C】替换空格,宏实现整数的二进制奇偶位交换
63 0
【C】替换空格,宏实现整数的二进制奇偶位交换