C++ 中计算范围内的置位比特数


假设我们给定一个整数,例如 num,以及一个由左值和右值定义的范围。任务是首先计算该数字的二进制位,然后从左位循环到右位,并在给定的范围内计算置位比特数。

二进制数中的置位比特由 1 表示。当我们计算整数的二进制数时,它是由 0 和 1 组成的组合。因此,在计算机术语中,数字 1 被称为置位比特。

输入 − int number = 50, left = 2, right = 5

输出 − 范围内置位比特的总数为 - 2

说明:数字 50 的二进制表示为 110010,我们有一个从 left = 2 开始的范围(其比特为 1)到 right = 5 结束的范围(其比特为 1),并且在该范围之间只有 0。因此,计数为 2。

输入 − int number = 42, left = 3, right 4

输出 − 范围内置位比特的总数为 - 1

说明 − 数字 42 的二进制表示为 101010,我们有一个从 left = 3 开始的范围(其比特为 1)到 right = 4 结束的范围(其比特为 0),并且在该范围之间只有一个数字。因此,计数为 1。

下面程序中使用的方案如下

  • 将数字输入到整数类型的变量中,以及具有左值和右值整数的范围。

  • 声明一个名为 count 的变量,用于存储无符号整数类型的置位比特总数。

  • 从 i 到 1<<7 和 i > 0 和 i 到 i / 2 开始 FOR 循环。

  • 在循环内部,检查 num & 1 == TRUE 则打印 1,否则打印 0。

  • 启动 while 循环以计算直到数字不为 0 的比特总数。

  • 在循环内部,设置 count = count + number & 1,并设置 number >>=1。

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

  • 此外,使用 count & a 设置 count。

  • 打印 count。

示例

 在线演示

#include<iostream>
using namespace std;
//Count total bits in a range
unsigned int bits(unsigned int number, unsigned int left, unsigned int right){
   unsigned int count = 0;
   unsigned i;
   //display the total 8-bit number
   cout<<"8-bit digits of "<<number<<" is: ";
   for (i = 1 << 7; i > 0; i = i / 2){
      (number & i)? cout<<"1": cout<<"0";
   }
   //calculate the total bits in a number
   while (number){
      count += number & 1;
      number >>= 1;
   }
   //calculate the set bit in a range
   int a = ((1 << right) - 1) ^ ((1 << (left - 1)) - 1);
   count = count & a;
   cout<<"\nCount of total set bits in a range are: "<<count;
}
int main(){
   unsigned int number = 42;
   unsigned int left = 2, right = 5;
   bits(number, left, right);
   return 0;
}

输出

如果我们运行上述代码,它将生成以下输出:

8-bit digits of 42 is: 00101010
Count of total set bits in a range are: 2

更新于: 2020年8月31日

284 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.