二元 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;
例如如果m
是4
,那么1 << 4
就是16
,减一就是15
,或者0b1111
,4个1
。
然后可以使用位与运算符&
得到b
的值。但请注意,此运算符(以及其他运算符)执行 二进制数字提升 。二进制数字提升确保使用不同的类型时,较窄的类型被加宽为与较宽的类型相同的类型。但它也会扩大到 int
如果它们还没有 int
.
这意味着在操作发生之前双方至少都提升到int
。将其投回 short
。
short b = (short) (a & bitmask);
请注意,由于二进制数字提升,位掩码的类型也可能是 int
。
您根本不需要将 m
翻译成 Y
。你只需要评估 a & m
.
如果您在执行此操作时遇到问题,则说明您没有说明是什么问题。您肯定忘记将结果转换回 short
.
什么类型的运算符使用逻辑与运算符 (&)?
我需要输入一个短 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;
例如如果m
是4
,那么1 << 4
就是16
,减一就是15
,或者0b1111
,4个1
。
然后可以使用位与运算符&
得到b
的值。但请注意,此运算符(以及其他运算符)执行 二进制数字提升 。二进制数字提升确保使用不同的类型时,较窄的类型被加宽为与较宽的类型相同的类型。但它也会扩大到 int
如果它们还没有 int
.
这意味着在操作发生之前双方至少都提升到int
。将其投回 short
。
short b = (short) (a & bitmask);
请注意,由于二进制数字提升,位掩码的类型也可能是 int
。
您根本不需要将 m
翻译成 Y
。你只需要评估 a & m
.
如果您在执行此操作时遇到问题,则说明您没有说明是什么问题。您肯定忘记将结果转换回 short
.