C# 反转“|”位移位或

C# 反转“|”位移位或,c#,reverse,bit,C#,Reverse,Bit,假设我有一个15作为c。 c可分为a=7和b=13。 那是因为a | b=c。 我试图写一个函数,通过只给c作为输入来找到a和b的一个可能组合 class Program { static void Main(string[] args) { int data = 560; int[] v = FindBitshiftOr(data); Console.WriteLine("{0} << {1} = {2}", v[0]

假设我有一个15作为c。 c可分为a=7和b=13。 那是因为a | b=c。 我试图写一个函数,通过只给c作为输入来找到a和b的一个可能组合

class Program
{
    static void Main(string[] args)
    {
        int data = 560;
        int[] v = FindBitshiftOr(data);
        Console.WriteLine("{0} << {1} = {2}", v[0], v[1], v[0] | v[1]);
        Console.ReadKey();
    }


    private static Random r = new Random();
    private static int[] FindBitshiftOr(int value)
    {
        int[] d = new int[2];
        int a = r.Next(0, value);
        int c = r.Next(0, value);
        int b = ~a;
        d[0] = a;
        d[1] = b | c;
        return d;
    }
}

这是我的尝试,但它总是返回-1,有人能解释我出了什么问题吗?

因为您将所有位设置为1,并将数字和它的负数相加

代码的基本部分是:

int a = 42; // you get random number, but it does not matter here.
int b = ~a | c; // "| c" part just possibly add more 1s 

result = a | b; // all 1s as it essentially  (a | ~a) | c  

正确的位分隔方法应该是x&~mask——请参阅中的链接/示例。

试试这段代码。And运算用于提取相同的位。我不懂C,所以我不能输入准确的代码。逻辑是取一个随机位掩码,c的位与该位掩码和该位掩码的倒数。得到的两个数字将是您需要的数字

int c = 4134;
int a = r.Next(0, value);
int first_num = c & a;
int second_num = c & ~a;
int check_c = first_num | second_num

检查c和c应该相等

Arrayint[]不能总是-1。。。你介意澄清一下吗?你知道c中的所有位,所以答案是这些位的每一个组合。但一般来说,不可能按位进行反向运算,或者,如果有多个位集,那么就有多个组合,并且没有一个正确的解决方案。我的意思是v[0]| v[1]=-1侧注:位掩蔽是用|来完成的,而不是用|…0,c作为答案吗?还是c,c?您是否对a和b有其他限制,如a&b==0?非常感谢,这很好:谢谢您的帮助!!