对2个整数执行XNOR

时间:2018-03-13 11:20:22

标签: c++ visual-c++ int

  

应对两个整数值(1101011 XNOR 1010101)执行XNOR操作,并应返回1000001。

int a = 1101011;
int b = 1010101;

int res = 0;
res = ~(a ^ b);

cout << res;
  

输出:-2073959。

我对编程非常陌生,对于我出错的地方的任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

您认为110101110101010是十进制值时出错了。事实上,它们是二进制的。

AFAIK,C ++不支持二进制赋值;如果是这样,您通常会使用0110101101101011b来表明这一点。因为它没有,你需要将它们视为十六进制来最容易地处理它们。

01101011 = 0x6b
10101010 = 0xaa

如果您在代码中使用这些值(换句话说,int a = 0x6b等),然后重复您的操作,您将正确执行操作。当前打印结果的方式,它将以十进制打印,然后必须转换为二进制(如果需要),尽管有人提供了注释以帮助您将输出转换为十六进制。 / p>

答案 1 :(得分:0)

您似乎假设变量ab由二进制值初始化。不过这些

1101011
1010101

是十进制整数文字。

如果你想使用二进制文字并且编译器支持它们,那么你应该写

int a = 0b1101011;
int b = 0b1010101;

否则,您可以使用十进制整数文字,但必须对它们应用适合于十进制值的操作,以获得看起来像二进制值的新十进制值。

似乎操作XNOR看起来像二进制按位AND运算符。

下面是一个示范程序,展示了如何获得所需的rtesult。

#include <iostream>

std::ostream & binary( int x, std::ostream &os = std::cout )
{
    if ( x ) binary( ( unsigned int )x >> 1 );
    os << ( x & 1 );

    return os;
}

int main() 
{
    int a = 0b1101011;
    int b = 0b1010101;

    int res = a & b;

    binary( a ) << std::endl;
    std::cout << "XNOR" << std::endl;
    binary( b ) << std::endl;
    std::cout << "========" << std::endl;
    binary( res ) << std::endl;

    return 0;
}

程序输出

01101011
XNOR
01010101
========
01000001

如果要处理二进制值的十进制表示,那么可以为操作XNOR编写单独的函数,例如

#include <iostream>

int xnor( unsigned int a, unsigned int b )
{
    const unsigned int Base = 10;
    unsigned int n = 1;
    unsigned int res = 0;

    while ( a and b )
    {
        res = res + n * ( a % Base and b % Base );
        n *= Base;
        a /= Base;
        b /= Base;
    }

    return res;
}

int main() 
{
    unsigned int a = 1101011;
    unsigned int b = 1010101;

    int res = xnor( a, b );

    std::cout << a << std::endl;
    std::cout << "XNOR" << std::endl;
    std::cout << b << std::endl;
    std::cout << "========" << std::endl;
    std::cout << res << std::endl;

    return 0;
}

程序输出

1101011
XNOR
1010101
========
1000001

考虑到你的方法在任何情况下都是错误的。

此表达式

res = ~(a ^ b);

如果对于变量10等于a,则将最高有效位设置为b。因此,对于正数,您将始终得到负数,因为符号位将设置为1

答案 2 :(得分:0)

我认为你的问题是你想要这样做:

  1101011 ^
  1010101
  -------
= 0111110

  0111110 ~
  -------
= 1000001

你实际上是这样做的:

  00000000000100001100110011010011 ^  // int  1101011
  00000000000011110110100110110101    // int  1010101
  --------------------------------
= 00000000000111111010010101100110    // int  2073958

  00000000000111111010010101100110 ~  // int  2073958
  --------------------------------
= 11111111111000000101101010011001    // int -2073959

所以而不是:

#include <iostream>

int main()
{
    int a = 1101011;
    int b = 1010101;

    int res = 0;
    int ans = 0;
    ans = (a ^ b);
    res = ~ans;

    std::cout << a << '\n';
    std::cout << b << '\n';
    std::cout << ans << '\n';
    std::cout << res << '\n';
}

使用#include <bitset>

#include <iostream>
#include <bitset>

int main()
{
    int a = 107;
    int b = 85;

    int res = 0;
    int ans = 0;
    ans = (a ^ b);
    res = ~ans;

    std::cout << std::bitset<7>(a) << '\n';
    std::cout << std::bitset<7>(b) << '\n';
    std::cout << std::bitset<7>(res) << '\n';
    std::cout << std::bitset<7>(res) << '\n';
}