在C++中查找数字二进制表示中长度>=n的连续1
假设我们有两个整数x和n,我们的任务是在32位二进制数中搜索第一个长度大于或等于n的连续1的序列,并返回其位置。如果不存在这样的序列,则返回-1。例如,如果x = 35,n = 2,则结果将为31。35的32位整数二进制表示如下:
00000000000000000000000000100011。因此,在索引31处存在两个连续的1,所以答案是31。
为了解决这个问题,我们必须找到前导零的数量,并根据该计数来查找连续的1。让我们看一个例子来更好地理解。
示例
#include<iostream>
using namespace std;
int leadingZeroCount(int x) {
unsigned y;
int n;
n = 32;
for(int i = 16; i > 1; i = i/2 ){
y = x >> i;
if(y != 0){
n -= i;
x = y;
}
}
y = x >> 1;
if (y != 0)
return n - 2;
return n - x;
}
int consecutiveOnePosition(unsigned x, int n) {
int k, p;
p = 0;
while (x != 0) {
k = leadingZeroCount(x);
x = x << k;
p = p + k;
k = leadingZeroCount(~x);
if (k >= n)
return p + 1;
x = x << k;
p = p + k;
}
return -1;
}
int main() {
int x = 35;
int n = 2;
cout << "Consecutive 1s of length " << n << " is starting from index: " << consecutiveOnePosition(x, n);
}输出
Consecutive 1s of length 2 is starting from index: 31
广告
数据结构
网络
关系数据库管理系统(RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP