一.练习:编写代码:求一个整数存储在内存中的二进制中1的个数

  • 首先:看到这个题是首先应该想到整数在内存中存储的形式是二进制的补码
  • 其次:例如整数123,若想知道这个十进制数的个十百位都是什么,可以用123%10,或者用123/10;同理对于一个二进制数来说,若想知道它的每一位是0是1,只需让它%2或/2
  • 最后:计算1的个数

代码如下:

#include<stdio.h>
int main()
{
  int a=0;
  int count=0;
  scanf("%d",&a);
  while(a)
  {
    if(a%2==1)
      count++;
    a=a/2;
  }
  printf("%d\n",count);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

大家可以拿个整数测验一下看看这段代码是否有问题。

这段代码是有问题的,对于正数可以使用,但对于负数束手无策,那么还有什么其他办法呢,这里就要用到我大标题的关于操作符的知识了。

#include<stdio.h>
int main()
{
  int a=0;
  scanf("%d",&a);
  int i=0;
  int count=0;
  for(i=0;i<32;i++)
  {
    if((a>>i)&1==1)
      count++;
  }
 printf("%d\n",count);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

总结:

1.通过这个小题,我们以后再见到类似于关于某个数中有几个几的问题都应该想到操作符&,或者操作符  | 。

2.当然,这道题也不只有这一种解题方法,大家还可以仔细想想别的,欢迎留言评论

二.将二进制为1011的数改为二进制为1111的数之后再改回去

大家可以先尝试写写,还是往操作符上去想

先写1011改为1111:

#include<stdio.h>
int main()
{
  int a=11;
  int b=a|(1<<2);
  printf("%d",b);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

再写1111改为1011:

#include<stdio.h>
int main()
{
  int a=15;
  int b=0;
  b=1&(~(1<<2));
  printf("%d\n",b);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

注:~这个操作符的意思是按位取反

总结:操作符一般与这两类题型有关:

  • 1.剥离二进制数
  • 2.改整数所在内存中存储的二进制数