输入一个整数,求该整数二进制格式有多少位是1
输入: 22
输出: 3
输入:251
输出:7
运用原理: n & (n-1)
比如: 16 与 16-1
16&15
的结果就是0. 发现什么了?? 抵消了数字16二进制的倒数第一个1.
下面我们以251画图演变:
上代码:
#include
int main()
{
int n = 0,count = 0;
scanf("%d", &n);
while(n)
{
n = n&(n-1);
count++;
}
printf("该数字有%d个1",count);
return 0;
}
输入一个整数n,判断n是不是2的次方. 是输出1,否则输出0
输入:16
输出:1
输入:9
输出:0
输入:32
输出:1
原理:还是 n&(n-1)
记得上面那个题我说的n-1
的作用是什么吗? 把二进制中的最后一个1的后面全部变为0.
比如1000(十进制8) - 1 = 0111;
而2进制的每位的权重就是2的次方,比如1011换算成十进制 1x2³ + 0x2² + 1x2¹ + 1x2º = 11
所以2的次方的二进制只能有一个1,且在最高位,比如:
那么只要 n&(n-1)
的结果是0,就说明n是2的次方
#include
int main()
{
int n = 0;
scanf("%d", &n);
int ret = 0;
ret = (n & (n - 1)) == 0 ? 1 : 0; //博主运用的条件表达式,大家也可以用if判断
printf("%d\n", ret);
return 0;
}
输入两个整数,求两个整数二进制中相同位置不同数字的位置有多少个?
输入: 22 33
输出: 5
输入:1999 2299
输出:7
解析:
题目要求的是求相同位置不同数字的位置数量,那我们是不是可以把相同的数字全部转化为0??(用 ^ 或运算)
剩下的就是不同的数字了,然后就是消去 1 .用 n&(n-1)
以22 33为例. 请看图:
而统计多少个1,不就是最开始那个题吗?
#include
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int ret = n ^ m;
int count = 0;
while(ret)
{
ret = ret&(ret - 1);
count++;
}
printf("不同的位有%d个", count);
return 0;
}
那么大家猜猜 这个用来干嘛的?对,判断整数n是不是奇偶
原理:
所以,如果 n&1为真,就是奇数
否则偶数