【问题标题】:XOR two Binary Strings c++异或两个二进制字符串c ++
【发布时间】:2017-01-16 14:01:01
【问题描述】:

我有两个字符串如下:

STRING1  :        011011110011000

STRING2  :        011001000001000

EXPECTED OUTPUT : 000010110010000

但是,当我尝试使用以下代码对它们进行异或(按位)时,输出为空白。 代码:

for(int i = 0; i<15; i++)
 {
    final_key[i] = STRING1[i] ^ STRING2[i]; 
    cout<<" XOR = "<<final_key[i];
 }

任何帮助将不胜感激。

【问题讨论】:

    标签: c++ xor bitwise-xor


    【解决方案1】:

    您正在尝试一次异或 2 char。试试吧:

    final_key[i] = ((STRING1[i]-'0') ^ (STRING2[i]-'0')) + '0'; 
    

    说明

    有关 ASCII 值,请参阅 here

    '0' 的 ASCII 值是 48,'1' 的 ASCII 值是 49。48 ^ 49 是 1,48 ^ 4849 ^ 49 是 0。这些将返回值 0 或 1 到char,代表EOF 字符(如果为0)或SOH 字符(如果为1),两者都不能正确输出。

    因此,您需要在执行 XOR 操作之前将每个 char 转换为一个位(0 或 1)。因此,您可以从每个char 中减去'0' 以得到数字的数值,进行XOR 运算,然后加回'0' 以获得正确的输出

    【讨论】:

    • 您的解决方案有效。我会尽快接受。任何解释(如果可能)。
    • 只是想我会指出一个简化。由于 48^49 = 1 和 48^48 = 49^49 = 0,实际上没有必要从每个输入字符中减去 '0'。只需将'0' 添加到结果中即可。
    • 是的,我刚刚意识到,其他答案也是我不知道存在的漂亮捷径。
    【解决方案2】:

    字符 '0' 和 '1' 的 ASCII 值是 48 和 49。 要对两个字符 a,b ∈ { '0', '1' } 应用 XOR,您可以使用:

    char result = std::abs(a - b) + '0';
    

    【讨论】:

      【解决方案3】:

      c++有std::bitset&lt;&gt;

      #incude <string>
      #incude <bitset>
      #incude <iostream>
      
      int main()
      {
          std::string s1 = "010101010101010101";
          std::string s2 = "101010101000001111";
      
          auto result = std::bitset<32>(s1) ^ std::bitset<32>(s2);
          std::cout << result << std::endl;
      }
      

      【讨论】:

      • 此代码产生以下错误:'result' 没有命名类型 auto result = std::bitset(s1) ^ std::bitset(s2);跨度>
      • 您是否使用 -std=c++11 标志进行编译?如果没有,您需要明确说明返回类型。
      【解决方案4】:

      您是 Xoring 字符。这有效,但您将结果按原样存储,而不将结果转换为字符。

      string s1="011011110011000";
      string s2="011001000001000";
      char final_key[15];
      for(int i = 0; i<15; i++)
       {
      final_key[i] = (s1[i] ^ s2[i])+'0'; //paranthesis is important
      cout<<final_key[i];
      }
      

      你也可以检查s1[i]是否不等于s2[i],则结果是1

      final_key[i]=(s1[i]!=s2[i]?'1':'0');
      

      【讨论】:

        【解决方案5】:
        string strings_xor(string s, string t) {
        
        string res = "";
        for(int i = 0; i < s.size(); i++) {
            if(s[i] == t[i])
                res += '0';
            else
                res += '1';
        }
        
        return res;
        }
        

        希望这会有所帮助。

        【讨论】:

          【解决方案6】:

          对于不同大小的字符串会更好。 :)

          string XOR(string a, string b){
          
              ll la = a.length();
              ll lb = b.length();
              string X;
              X = (la > lb ) ? a : b;
          
              ll i=(la>lb)?la-1:lb-1, j = (la<lb)?la-1:lb-1,x=(la>lb? la-1:lb-1) ;
              for(;i>=0,j>=0;i--,j--,x--){
          
                  X[x] =  (la>lb)? ( a[i] ^ b[j] )+'0' : ( b[i] ^ a[j] )+'0'; 
              }
          
          
              return X;
          } 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-11-07
            • 1970-01-01
            • 1970-01-01
            • 2014-01-01
            • 1970-01-01
            • 2016-02-29
            • 1970-01-01
            • 2013-06-28
            相关资源
            最近更新 更多