反转'|'移位或
Reverse '|' Bitshift Or
假设我有一个 15 作为 c。
c 可以拆分为 a = 7 和 b = 13。
那是因为一个 | 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,因为您将所有位设置为 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
- 请参阅 Most common C# bitwise operations on enums 中的 links/samples。
试试这个代码。并且操作用于提取相同的位。我不懂 C#,所以无法输入确切的代码。逻辑是采用随机位掩码并将 c
的位与该位掩码和该位掩码的倒数进行 AND 运算。得到的两个数字将是您需要的数字。
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
check_c
和 c
应该相等
假设我有一个 15 作为 c。 c 可以拆分为 a = 7 和 b = 13。 那是因为一个 | 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,因为您将所有位设置为 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
- 请参阅 Most common C# bitwise operations on enums 中的 links/samples。
试试这个代码。并且操作用于提取相同的位。我不懂 C#,所以无法输入确切的代码。逻辑是采用随机位掩码并将 c
的位与该位掩码和该位掩码的倒数进行 AND 运算。得到的两个数字将是您需要的数字。
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
check_c
和 c
应该相等