二元 AND 运算符的操作数类型

Type of operand of binary AND operator

什么类型的运算符使用逻辑与运算符 (&)? 我需要输入一个短 a 和一个从 1 到 16 不等的 "number" m 并获得另一个短 b。 该原始类型必须是 m?

示例:

? m = ...; //with 1 <= m <= 16
short a = 2;
short b = a & m;

我看过的例子是这样的:

short b = a & 0xY;

如何将 m 值转换为 Y 以确保 AND 运算正确? 所以 b 包含 a.

的最后 m

如果我将 m 用作 int,则无法获得正确的结果。

我阅读了有关运算符的 this 页面,但它没有说明任何内容。

谢谢。

要从 a 中获取最后的 m 位,您需要一个位掩码,其中最低有效的 m 位设置为 1,其余设置为0.

你可以从等于 2m 的 2 的幂中减去 1,或者 1 向左移动 m 次。

int bitmask = (1 << m) - 1;

例如如果m4,那么1 << 4就是16,减一就是15,或者0b1111,4个1

然后可以使用位与运算符&得到b的值。但请注意,此运算符(以及其他运算符)执行 二进制数字提升 。二进制数字提升确保使用不同的类型时,较窄的类型被加宽为与较宽的类型相同的类型。但它也会扩大到 int 如果它们还没有 int.

这意味着在操作发生之前双方至少都提升到int。将其投回 short

short b = (short) (a & bitmask);

请注意,由于二进制数字提升,位掩码的类型也可能是 int

您根本不需要将 m 翻译成 Y。你只需要评估 a & m.

如果您在执行此操作时遇到问题,则说明您没有说明是什么问题。您肯定忘记将结果转换回 short.