在C ++中,只有1个置位的数字在[0,n]范围内
给我们一个数字,任务是计算范围为0到给定数字的数字计数,比如说num恰好有一个设定位
二进制数中的设置位用1表示。每当我们计算一个整数值的二进制数时,它就会形成为0和1的组合。因此,数字1在计算机方面称为设置位。
输入-intnum=15
输出-在[0,15]范围内只有1置位的位数为-4
说明-给定的数字是15,因此范围是0-15。现在计算4位数
的二进制数-
0->0000=0设置位,1->0001=1设置位,2->0010=1设置位,3->0011=2设置位,4->0100=1设置位,5->0101=2个设置位,6->0110=2个设置位,7->0111=3个设置位,8->1000=1设置位,1->1001=2个设置位,10->1010=2个设置位,11->1011=3个设置位,12->1100=2个设置位,13->1101=3个设置位,14->1110=3个设置位,15->1111=4个设置位现在,我们将选择仅具有一个设置位的数字,它们分别是1、2、4和8。
输入-intnum=4
输出-在[0,15]范围内只有1置位的位数为-3
说明-给定的数字是4,因此范围是0-4。现在计算4位二进制
-的编号
0->0000=0设置位,1->0001=1设置位,2->0010=1设置位,3->0011=2设置位,4->0100=1设置位。现在,我们将选择仅具有一个设置位的数字,即1、2和4。
以下程序中使用的方法如下
解决给定问题的方法可以有多种,即幼稚方法和有效方法。因此,让我们首先来看一下幼稚的方法。
输入数字并将其传递给函数进行进一步处理。
进行临时变量计数,以将设置的位正好为1的范围内的数字计数存储
从i到1开始循环直到数字
在循环内部,使用'__builtin_popcount(i)'设置一个临时变量,该函数返回设置的位数。
检查IFtemp=1然后增加计数
返回计数
打印结果
高效的方法
输入数字并将其传递给函数进行进一步处理。
进行临时变量计数,以将设置的位正好为1的范围内的数字计数存储
从温度开始直到温度<=数字时开始循环
在循环内部,将计数增加1并将temp设置为temp*2
返回计数
打印结果
示例(幼稚的方法)
#include <iostream> using namespace std; //函数对仅具有1设置位的数字进行计数[0,n] int set_bits(int number){ int count = 0; for (int i = 1; i <= number; i++){ int temp = __builtin_popcount(i); if (temp == 1){ count++; } } return count; } int main(){ int number = 15; cout<<"Count of numbers having only 1 set bit in the range [0, "<<number<<"] are: "<<set_bits(number); return 0; }
输出结果
如果我们运行上面的代码,它将生成以下输出-
Count of numbers having only 1 set bit in the range [0, 15] are: 4
示例(有效方法)
#include <iostream> using namespace std; //函数对仅具有1设置位的数字进行计数[0,n] int set_bits(int number){ int count = 0; int temp = 1; while(temp <= number){ count++; temp = temp *2; } return count; } int main(){ int number = 15; cout<<"Count of numbers having only 1 set bit in the range [0, "<<number<<"] are: "<<set_bits(number); return 0; }
输出结果
如果我们运行上面的代码,它将生成以下输出-
Count of numbers having only 1 set bit in the range [0, 15] are: 4