C++ 中计算范围内的未设置位
给定一个整数,例如 num,以及具有左值和右值的范围。任务是首先计算数字的二进制数位,然后从左数位循环到右数位,然后在给定范围内计算未设置的位。
二进制数中的未设置位由 0 表示。当我们计算整数的二进制数时,它由 0 和 1 的组合形成。因此,数字 0 在计算机术语中被称为未设置位。
输入 − int number = 50, left = 2, right = 5
输出 − 范围内未设置位的总数为 - 2
说明 − 数字 50 的二进制表示为 110010,我们有一个从 left = 2(其位为 1)开始到 right = 5(其位为 1)结束的范围,并且在该范围之间我们有两个 0。因此,未设置位的数量为 2。
输入 − int number = 42, left = 1, right 6
输出 − 范围内未设置位的总数为 - 3
说明 − 数字 42 的二进制表示为 101010,我们有一个从 left = 1(其位为 1)开始到 right = 6(其位为 0)结束的范围,并且在该范围之间我们有三个 0。因此,计数为 3。
下面程序中使用的方法如下
将数字输入到整型变量中,以及具有左值和右值范围的整数。
声明一个变量 count 来存储设置位的总数,类型为无符号整数
从 i 到 1<<7 并 i > 0 以及 i 到 i / 2 开始循环 FOR
在循环内,检查 num & 1 == TRUE 则打印 1 否则打印 0
从 i 到左值到右值开始循环 FOR
在循环内,递增给定范围内的数字总数
开始循环 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 unset bits in a range unsigned int unset_bits(unsigned int number, unsigned int left, unsigned int right){ unsigned int count = 0; unsigned int total_bits = 0; unsigned i; //display the 8-bit number cout<<"8-bit number of "<<number<<" is: "; for (i = 1 << 7; i > 0; i = i / 2){ (number & i)? cout<<"1": cout<<"0"; } //calculate total number of bits in a given range for(i = left; i<=right; i++){ total_bits++; } //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; //subtract set bits from the total bits in a range 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