首页 > 解决方案 > C++:字符串和整数之间的异或

问题描述

假设我有两个向量:

std::vector<int> numbers;
std::vector<std::string> words;

我读了两个文件:一个只有数字,另一个有单词。我想用数字作为我的话的密码,因此numbers XOR words会是一个ciphertext并且ciphertext XOR numbers会给我words回馈。

我正在尝试做类似的事情

int charCount = wordsCount >= numbersCount ? numbersCount : wordsCount;

for (int i = 0; i < charCount; i++) {
    result[i] = words[i] ^ numbers[i];
}

但这不起作用

no match for 'operator^' (operand types are '__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::basic_string<char> >, std::__cxx11::basic_string<char> >::value_type' {aka 'std::__cxx11::basic_string<char>'} and '__gnu_cxx::__alloc_traits<std::allocator<int>, int>::value_type' {aka 'int'})|

我怎样才能以最简单的方式做到这一点?

UPD:所以我真正想要的是将单词中的每个字符与以下数字进行异或。

标签: c++

解决方案


如果要对单词的所有字符进行异或运算,并使用相应的数字,则需要遍历每个字符。没有办法用 .xor 对字符串的所有字符进行异或运算operator^

你可以这样做

std::transform(std::begin(numbers), 
               std::begin(numbers) + std::min(numbers.size(), words.size()),
               std::begin(words),
               std::begin(words),
               [](auto number, auto word)
               {
                  std::transform(std::begin(word), std::end(word), 
                                 std::begin(word), 
                                 [number](auto c)
                                 { return c ^ number; });
                  return word;
               });

它是对称的,因此可用于编码和解码。

我很少建议这样做,但在这种情况下,传统的 for 循环可能更具可读性:

int min = std::min(numbers.size(), words.size());

for (int i = 0; i < min; ++i) 
  for (int j = 0; j < words[i].size(); ++j)
    words[i][j] = words[i][j] ^ numbers[i];

推荐阅读