这些按位操作是做什么的
问题描述:
uint sum = generateSum();
int forced = getForcedBitfield();
int previousSum = getPreviousSum();
sum = (~forced & sum) + (forced & previousSum);
最后一行究竟是干什么的?总和是32个布尔值。这是一个位域。强制是一个位域,previousSum是一个位域。这些按位操作是做什么的
用普通英语最后一行是干什么的? (不操作,我知道穷人被迫与和ANDS它,然后会将此与先前的和强制相与)
答
这将有选择地从两个值(sum
& previousSum
),其中“上”位来自接位previousSum
和“关”位来自sum
。
因为加法运算的两个操作数的互斥位被设置为1,所以加法的效果与布尔Or相同。
这就像使用模板合并两个图像。
要看到这是如何工作,让我们使用4个值:
被迫= 0011(和〜被迫= 1100)
previousSum = 0110
总和= 1111
〜被迫&总和= 1100
被迫& previousSum = 0010
没有比特被 “接通” 这两个值,所以总和为s ame作为OR,效果等同于从两个有效位中选择位来构造新的值。
无法分辨,直到提供更多上下文。 –
它从'sum'中取出所有未被强制的位(即'〜forced'在那里有一个1),并将该和加到'previousSum',从而'forced'在加法之前选择'previousSum'中的位。 –
我想把这些位字段变成数组,并且我需要将按位逻辑变成正则逻辑...... – jmasterx