应用基于不同掩码的位掩码
Applying a bit mask based on a different mask
这里有点困惑。
我有一个 4 位的序列,名为 A。它必须根据 2 个掩码进行修改:B 和 C。 B 是一个掩码,告诉我们要修改 A 的哪些位,而 C 告诉我们应用于 A 的值。在我的例子中 C 总是 1111 或 0000,但我也对通用答案感兴趣。
例如,让我们从:
开始
A = 0000
B = 0001
C = 1111
// Then the result should be:
D = 0001
一个不那么简单的例子:
A = 0001
B = 1010
C = 1111
// Then the result should be:
D = 1011
并以不同的方式展示 C:
A = 1011
B = 0010
C = 0000
// Then the result should be:
D = 1001
在 C++ 中使用按位运算完成此操作的最佳(最简洁、可读和有效)方法是什么?
二进制C
,可读版本:
if (C) {
D = A | B;
} else {
D = A & ~B;
}
任意C
:
首先,我们需要在B
和C
[=26=中设置A
到1
的那些位等于1
]
D = A | (B & C)
然后我们需要将这些位设置为 0
,等于 B
中的 1
和 C
[=26= 中的 0
]
D = D & ~(B & ~C)
或者简单一点
D = D & (~B | C)
这里有点困惑。
我有一个 4 位的序列,名为 A。它必须根据 2 个掩码进行修改:B 和 C。 B 是一个掩码,告诉我们要修改 A 的哪些位,而 C 告诉我们应用于 A 的值。在我的例子中 C 总是 1111 或 0000,但我也对通用答案感兴趣。
例如,让我们从:
开始A = 0000
B = 0001
C = 1111
// Then the result should be:
D = 0001
一个不那么简单的例子:
A = 0001
B = 1010
C = 1111
// Then the result should be:
D = 1011
并以不同的方式展示 C:
A = 1011
B = 0010
C = 0000
// Then the result should be:
D = 1001
在 C++ 中使用按位运算完成此操作的最佳(最简洁、可读和有效)方法是什么?
二进制
C
,可读版本:if (C) { D = A | B; } else { D = A & ~B; }
任意
C
:首先,我们需要在
B
和C
[=26=中设置A
到1
的那些位等于1
]D = A | (B & C)
然后我们需要将这些位设置为
0
,等于B
中的1
和C
[=26= 中的0
]D = D & ~(B & ~C)
或者简单一点
D = D & (~B | C)