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

时间:2016-03-04 21:35:53

标签: java bit-manipulation bitwise-operators bitwise-and

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

示例:

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

我见过的例子如下:

short b = a & 0xY;

如何以操作AND正确的方式将m值翻译为Y? 因此b包含m的最后a位。

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

我阅读了有关操作员的this页面,但没有说明这一点。

感谢。

2 个答案:

答案 0 :(得分:0)

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

你可以通过从2的幂等于2 m 减去一个,或者0向左移1次来得到这个。

m

E.g。如果int bitmask = (1 << m) - 1; m,则41 << 4,减去一个为16,或15,4 0b1111

然后,您可以使用按位和运算符1来获取值&。但请注意,此运算符(以及其他)执行二进制数字提升。二进制数字促销确保使用不同类型将较窄类型加宽为与较宽类型相同的类型。但如果它们还没有b,它也会扩展到int

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

short

请注意,由于二进制数字提升,位掩码的类型可能也是short b = (short) (a & bitmask);

答案 1 :(得分:0)

您根本不必将m翻译为Y。您只需评估a & m

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