C# - 逐位比较 2 个整数并输出多个整数的快速方法,可能吗?
C# - fast way to compare 2 integers, bit by bit, and output for more than one integer, possible?
我有两个输入整数和一个输出列表 myoutputlist。我的输入可以说
A=0x110101
B=0x101100
然后我根据A和B计算了一个C整数numbers.I已经编码了它的算法,我可以计算C整数。 C 整数显示应更改哪些位。 1 值表示变化的位,0 值表示不变的位。每次只能改变一位。由于 C 整数取决于 A 和 B 输入,有时需要更改 1 位,有时 3 位,有时 8 位。在这个给定的 A 和 B 值中,我有 C 整数如下
C=0x 010010(1代表变化的值;在这种情况下应该改变第二和第五位)
因为 C 整数有两次值为“1”;在这种情况下应该有 2 个结果
结果1-只改变第二位,其他位同A(0x110101) :
改变 A 的第二位 => D1=1101 1 1
结果2-只改变第五位,其他位同A(0x110101):
改变 A 的第五位 => D2=1 1 0101
我在想的是用for循环,一步步移动A和C,然后用&1掩码给C?并检查它是否等于“1”
for(i=0;i<32;i++)
{int D=(C>>i)&1; //I tried to check if i.th value is equal to 1 or not
if(D==1)
{ int E=(A&(~(2^i))) | ((2^i)&(~B)) //in first brackets, I removed i.th bit of A, then replaced it with "not B" value.
myoutputlist.add(E);
}
}
我需要做很多计算,但令人不安的问题是我需要检查 (D==1) 32 次。我将使用它数百万次,一些计算大约需要 2 分钟。我正在寻找一种更快的方法。有什么想法,技巧吗?
希望我理解你的问题。
您正在寻找 XOR 运算符。
C = A ^ B
A 110101
B 101100
--------
C 011001
如果两个输入为 "different",XOR 将始终为 1。参见:
| A | B | XOR |
|---+---+-----|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
然后你将能够像这样循环遍历 C
的位:
for (int i = 0; i < 32; i++)
{
bool bit = (C & (1 << i)) != 0;
}
我有两个输入整数和一个输出列表
A=0x110101
B=0x101100
然后我根据A和B计算了一个C整数numbers.I已经编码了它的算法,我可以计算C整数。 C 整数显示应更改哪些位。 1 值表示变化的位,0 值表示不变的位。每次只能改变一位。由于 C 整数取决于 A 和 B 输入,有时需要更改 1 位,有时 3 位,有时 8 位。在这个给定的 A 和 B 值中,我有 C 整数如下
C=0x 010010(1代表变化的值;在这种情况下应该改变第二和第五位)
因为 C 整数有两次值为“1”;在这种情况下应该有 2 个结果
结果1-只改变第二位,其他位同A(0x110101) :
改变 A 的第二位 => D1=1101 1 1
结果2-只改变第五位,其他位同A(0x110101):
改变 A 的第五位 => D2=1 1 0101
我在想的是用for循环,一步步移动A和C,然后用&1掩码给C?并检查它是否等于“1”
for(i=0;i<32;i++)
{int D=(C>>i)&1; //I tried to check if i.th value is equal to 1 or not
if(D==1)
{ int E=(A&(~(2^i))) | ((2^i)&(~B)) //in first brackets, I removed i.th bit of A, then replaced it with "not B" value.
myoutputlist.add(E);
}
}
我需要做很多计算,但令人不安的问题是我需要检查 (D==1) 32 次。我将使用它数百万次,一些计算大约需要 2 分钟。我正在寻找一种更快的方法。有什么想法,技巧吗?
希望我理解你的问题。
您正在寻找 XOR 运算符。
C = A ^ B
A 110101
B 101100
--------
C 011001
如果两个输入为 "different",XOR 将始终为 1。参见:
| A | B | XOR |
|---+---+-----|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
然后你将能够像这样循环遍历 C
的位:
for (int i = 0; i < 32; i++)
{
bool bit = (C & (1 << i)) != 0;
}