如何在 O(n) 中将二进制和转换为二进制
How to convert binary sum to binary in O(n)
我正在尝试找到将 img 二进制文件转换为二进制文件的最佳解决方案。我使用 2 的幂将大量数字保存在数组中并保持总和。例如,我将数字 $2^{3} + 4x2^{2} + 5x2^{1}$ = 29 保留在 4 的数组中,如 {0,5,4,1},其中数组的每个位置都有每个 2 的幂出现的时间。 程序完成后,我想将这个数组转换为一个数组,该数组产生相同的总和,但数组中只有一个或零。用她的话来说,我想将这个总和转换为二进制。所以我的例子会给出数组 {1,0,1,1,1} = 29
我如何在 O(n( 中的 c++ 中进行此转换
我当前的解决方案是 O($n^{2}$(,如下所示:
bool bl = true;
while (bl) {
for (int i = 0; i < M; i++) {
if (num[i] != 0 && num[i] != 1) {
vector<long int> p = block(num[i]);
num[i] = 0;
for (auto j = 0; j < p.size(); ++j) {
if (p[j]!=0)
num[j + i] += 1;
}
}
}
bl = false;
for (int i = 0; i < M; i++) {
if (num[i] == 0 || num[i] == 1) {
bl = false;
continue;
}
else {
bl = true;
break;
}
}
}
for (int i = 0; i <= M; i++)
{
cout << i << ':' << num[i] << 'n';
}
你知道(2k+j)*2^N === j*2^N + k*2^(N+1)
,所以你可以向前"滚动"值>= 2:
for (int i = 0; i < num.size(); i++) {
if (num[i] < 2)
continue;
if (i+1 == num.size()) {
if (num.size() == num.capacity())
num.reserve(num.size() + 5);
num.push_back(0);
}
num[i+1] += num[i] / 2;
num[i] %= 2;
}
请注意,这会在溢出时每转一圈将存储增加 5 个元素。如果您期望巨大的数字,则可能需要调整此值以减少矢量复制的数量。
相关文章:
- C++从二进制转换为十进制数
- 我写的 ASCII 到二进制转换器C++向后显示二进制,如何使其正确显示?
- 十进制到二进制转换器 c++
- 将二进制转换为十进制,我如何要求用户仅输入二进制
- 十进制,包括负到 32 位二进制转换器
- 输入 1024 后十进制到二进制转换的输出错误?
- C 二进制转换为双精度的转换运算符
- 将二进制转换为负整数
- 如何将 32 位编译二进制转换为 64 位
- 如何在 C++ 中将二进制转换为十六进制
- 如何理解 c++ 中的 MNIST 二进制转换器?
- 以下对二进制转换代码的小数如何工作
- 具有递归功能的二进制转换给出一个奇数值
- 了解C++位操作中的二进制转换实现
- 编写将二进制转换为文本C 6的程序
- 反射格雷码到二进制转换中的幻数
- 为什么我总是必须除以 49 才能得到二进制转换器 + cout 歧义的正确答案?
- 如何使用库将二进制转换为十进制<bitset>?
- C++二进制转换为十进制,八进制
- 脚本到二进制转换和对象序列化