C# 这些按位操作在做什么
最后一行到底在做什么?总和是32个布尔值。这是一个位字段。Forced是位字段,previousSum是位字段C# 这些按位操作在做什么,c#,bit-manipulation,C#,Bit Manipulation,最后一行到底在做什么?总和是32个布尔值。这是一个位字段。Forced是位字段,previousSum是位字段 用通俗易懂的英语说,最后一行在做什么?(不是操作,我知道它不是强制的,用sum和它相加,然后用上一个sum和它相加)这将有选择地从两个值(sum&previousSum)中选择位,其中“on”位来自previousSum,“off”位来自sum) 由于加法运算的两个操作数的互斥位设置为1,因此加法的效果与布尔Or相同 这就像使用模具组合两个图像 要了解其工作原理,让我们使用4位值: 强
用通俗易懂的英语说,最后一行在做什么?(不是操作,我知道它不是强制的,用sum和它相加,然后用上一个sum和它相加)这将有选择地从两个值(
sum
&previousSum
)中选择位,其中“on”位来自previousSum
,“off”位来自sum
)
由于加法运算的两个操作数的互斥位设置为1,因此加法的效果与布尔Or相同
这就像使用模具组合两个图像
要了解其工作原理,让我们使用4位值:
强制=0011(和~forced=1100)上一次总和=0110
总和=1111
~forced&sum=1100
强制和先前总和=0010
两个值中都没有位是“开”的,因此求和与或相同,其效果等于从两个有效值中选择位来构造新值。在提供更多上下文之前无法判断。它从
sum
中获取所有未强制的位(即~forced
中有一个1)并将该和添加到上一个和
,从而强制
在添加之前从上一个和
中选择位。我正在尝试将这些位字段转换为数组,我需要将按位逻辑更改为常规逻辑…只需以二进制形式写出一些值并进行计算~
=按位not、&
=按位and等…这看起来像是有人想避免编写IF语句,反而让你抓狂了。建议您找到这是谁写的(在您的版本控制中使用责怪工具)并询问他们。也许您可以在回答中指出,在这种情况下,+
与|
相同,因为强制&x
和~forced&x
意味着不能有任何携带?这可能是提问者困惑的根源。因此,对于总和中的每一位。。。如果未强制求和[x],则使用上一次求和[x],否则使用上一次求和[x]?如果强制求和,则使用上一次求和,否则使用上一次求和。
uint sum = generateSum();
int forced = getForcedBitfield();
int previousSum = getPreviousSum();
sum = (~forced & sum) + (forced & previousSum);