如何分割一个二进制字符串来比较每个数字

How do I split up a string of binary to compare each digit?

本文关键字:字符串 比较 数字 二进制 一个 分割 何分割      更新时间:2023-10-16

我必须取任意长度的二进制字符串,填充字符串直到它可以分成3组。假设我有一个字符串5,我在它的右端添加一个0,使它成为一个字符串6,然后将它们分成3,并将相同的数字与异或运算符进行比较。我知道如何将二进制字符串填满0直到它能被3整除,但我不知道如何将它除以3并比较数字。下面是我用0填充它的代码。

string binary;
cin >> binary;

while(binary.length() < 6){
    binary = "0" + binary;
}

while(binary.length()%3 != 0){
    binary = "0" + binary;
}

int size = binary.length();

使用for-loop迭代字符串并创建新字符串将其添加到动态数组中然后您可以迭代动态数组

string *a = new string[ binary.length() ];
for(int i = 0; i <= binary.length() - 3; i +=3 )
{
    a[i/3] = binary.substr(i, 3);
}
//now you have array of 3 length splitted parts
delete[] a;

编辑

如果您不需要将子字符串的三元组设置为每个子字符串的第一、第二和第三个元素的xor,只需使用

//to convert char to int I'm subtracting 48 from its ASCII
int xors[3] = { (int)binary[0] - 48, (int)binary[3] - 48, (int)binary[2] - 48, };
for(int i = 3; i <= binary.length() - 3; i +=3 )
{
    xors[0] ^= (int)binary[i] - 48;
    xors[1] ^= (int)binary[i+1] - 48;
    xors[2] ^= (int)binary[i+2] - 48;
}

如果你想让三元组迭代,使用上面的代码并遍历它,像下面这样处理

为什么要转换成整数?可以用std::string做这一切;-)完整的可运行程序。唯一的要求是初始字符串digits的长度为3。任何预处理(例如添加填充'0')都将被忽略。

程序很容易适应分组不同数量的位,只需改变3的值到所需的分组长度(并确保输入至少是那个长度)。

#include <string>
#include <iostream>
using namespace std;
int main() {
    // Assume string has been made at least six long; although we settle for 3
    string            digits("000111101");
    string::iterator  ptr = next(digits.begin(), 3);
    // copy first N digits into our accumulators
    string            xors(digits.begin(), ptr);
    string::size_type idx = 0;
    // Aggregate-xor the remaining digits
    while( ptr!=digits.end() ) {
        xors[ idx ] = (xors[idx]!=*ptr) ? '1' : '0';
        ptr++, idx = (idx + 1) % xors.size();
    }
    cout << "Final xor'ed bits: " << xors << endl;
}

输出:

Final xor'ed bits: 010