计算C ++中某个范围内的未设置位

我们给定一个整数,例如num和带有左右值的范围。任务是首先计算一个数字的二进制数字,然后设置从左数字到右数字的循环,然后在给定范围内计算未设置的位。

二进制数中的未设置位用0表示。每当我们计算整数值的二进制数时,它就会形成为0和1的组合。因此,数字0在计算机方面被称为未设置位。

输入-整数= 50,左= 2,右= 5

输出-范围内的总未设置位数为-2

解释-数字50的二进制表示为110010,我们有一个范围是从left = 2(其位为1)到right = 5(其位为1),在范围之间有两个0。因此,未设置的位数为2。

输入-整数= 42,左= 1,右6

输出-范围内的总未设置位数为-3

解释-数字42的二进制表示是101010,我们有一个范围是从left = 1开始,该位的比特为1,到right = 6,该比特的位为0,并且在该范围之间,我们有三个0。因此计数为3。

以下程序中使用的方法如下

  • 在整数类型的变量中输入数字,并在范围内输入左右整数值。

  • 声明一个变量计数以存储unsigned int类型的置位总数

  • 从i到1 << 7并且i> 0和i到i / 2的启动循环

  • 在循环中,检查num&1 == TRUE,然后打印1,否则打印0

  • 从i开始向左循环直到右值

  • 在循环内,在给定范围之间增加位数的总数

  • 启动循环,同时计算位数不为0的总位数

  • 在循环内,设置count = count + number&1,还设置number >> = 1

  • 设置一个临时变量,例如a(((1 << right)-1)^((1 <<(left-1))-1);

  • 另外,用count和a设置count

  • 最后,将count设置为范围内的总位数-范围内的总设置位数。

示例

#include<iostream>
using namespace std;
//计算范围内的总未设置位
unsigned int unset_bits(unsigned int number, unsigned int left, unsigned int right){
   unsigned int count = 0;
   unsigned int total_bits = 0;
   unsigned i;
   //显示8位数字
   cout<<"8-bit number of "<<number<<" is: ";
   for (i = 1 << 7; i > 0; i = i / 2){
      (number & i)? cout<<"1": cout<<"0";
   }
   //计算给定范围内的总位数
   for(i = left; i<=right; i++){
      total_bits++;
   }
   //计算一个数字的总位数
   while (number){
      count += number & 1;
      number >>= 1;
   }
   //计算范围内的设置位
   int a = ((1 << right) - 1) ^ ((1 << (left - 1)) - 1);
   count = count & a;
   //从范围内的总位中减去设置位
   count = total_bits - count;
   cout<<"\nCount of total unset bits in a range are: "<<count;
}
int main(){
   unsigned int number = 80;
   unsigned int left = 1, right = 4;
   unset_bits(number, left, right);
   return 0;
}

输出结果

如果我们运行上面的代码,它将生成以下输出-

8-bit number of 80 is: 01010000
Count of total unset bits in a range are: 2