什么是按位或非(NOR)计算器?
该工具按照公式 \(\text{结果} = \sim(\text{A} \mathbin{|} \text{B})\) 计算两个整数的按位或非。NOR(即“非或”,NOT OR)是一种基础逻辑运算:它先对每一对对应位执行“或”(OR)运算,再对结果取反。只有当两个输入位都为 0 时,输出位才为 1。NOR 是一种“功能完备”的运算——任何其他逻辑门都可以仅用 NOR 门搭建出来,这正是它在数字电子领域如此重要的原因。
如何使用
输入两个整数(A 和 B),并选择一个位宽(8、16、32 或 64 位)。计算器会返回该位宽下以无符号数解释的 NOR 结果,同时给出中间的 OR 值以及二进制表示。选择较小的位宽相当于把更高位掩码(mask)掉,这在模拟固定位宽寄存器时非常实用。
公式详解
两个位的“或”(OR)只要有一位为 1,结果就为 1。NOR 则对其取反,因此每一位都遵循如下真值表:0 NOR 0 = 1,0 NOR 1 = 0,1 NOR 0 = 0,1 NOR 1 = 0。由于直接取反(~)会把所有高位都置为 1,我们需要用 \(2^n - 1\) 对结果做掩码,使其保持在所选的无符号位宽范围之内。
$$\text{NOR} = \sim\left(\text{A} \mathbin{|} \text{B}\right) \mathbin{\&} \left(2^{\text{Bits}} - 1\right)$$
实例演算
设 A = 12(二进制 1100),B = 10(二进制 1010),位宽为 8 位。\(\text{A} \mathbin{|} \text{B} = 1110 = 14\)。在 8 位范围内取反得到 \(11110001 = 241\)。因此在 8 位宽下,\(12 \ \text{NOR}\ 10 = \mathbf{241}\)。
NOR真值表与位宽掩码
按位NOR运算逐位组合两个操作数。对于每对位,它首先计算OR,然后反演结果。换句话说,输出位为1仅当两个输入位都为0;在其他所有情况下输出位为0。这是OR的否定,因此得名NOR(NOT-OR)。
| A | B | A | B | NOR = ~(A | B) |
|---|---|---|---|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 0 |
由于NOT步骤反演每一位,结果取决于所选的位宽。在对操作数进行OR并反演之后,值使用\(2^{n}-1\)进行掩码处理,以便仅保留最低的\(n\)位。下面显示每个支持的宽度的掩码。
| 位宽\(n\) | 掩码\(2^{n}-1\)(十进制) | 最大无符号值 |
|---|---|---|
| 8 | 255 | 255 |
| 16 | 65535 | 65535 |
| 32 | 4294967295 | 4294967295 |
| 64 | 18446744073709551615 | 18446744073709551615 |
例如,在8位宽度下,\(A = 12\)和\(B = 10\)时:\(12 | 10 = 14\),\(\sim 14\)掩码到8位得到241。中间OR结果\(12 | 10 = \)14可以独立验证。
关键术语
- 按位NOR
- 一种运算,产生的结果的每一位仅在两个操作数的对应位都为0时为1。它被定义为OR结果的反演:\(\text{NOR} = \sim(A | B)\)。
- OR(按位)
- 一种运算,如果两个对应的输入位中至少有一个为1,则将每个结果位设置为1;仅当两个都为0时才设置为0。
- NOT / 反演(~)
- 一个一元运算,反演每一位:每个0变为1,每个1变为0。在NOR中,它被应用于OR结果,其效果受所选位宽的限制。
- 位宽
- 用于表示值的位数(这里为8、16、32或64)。它决定反演结果保留多少位,因此决定输出的数值范围。
- 掩码
- 使用与\(2^{n}-1\)这样的值进行按位AND以仅保留最低\(n\)位并丢弃较高位。这将NOR结果限制在选定的宽度内。
- 无符号整数
- 没有符号位的整数表示,因此所有位模式表示从0到\(2^{n}-1\)的非负值。NOR结果报告为无符号值。
- 函数完备(通用)门
- 一种门,可以使用其自身的副本构建任何布尔函数。NOR是函数完备的:AND、OR和NOT都可以仅从NOR门构建,这就是为什么它被称为通用门。
常见问题
为什么结果会随位宽变化? 取反会翻转每一个位,因此前导的若干个 1 取决于用多少位来表示该数字。位宽越大,得到的无符号结果就越大。
可以使用负数吗? 输入会被当作整数处理;为获得清晰的结果,建议使用所选位宽范围内的非负整数。
NOR 和 NAND 一样吗? 不一样。NAND 是 \(\sim(\text{A} \mathbin{\&} \text{B})\)(非与),而 NOR 是 \(\sim(\text{A} \mathbin{|} \text{B})\)(非或)。两者都是通用门,但输出结果不同。