从C#迁移到Java、int&;ushort(按位和)

从C#迁移到Java、int&;ushort(按位和),java,c#,bit-manipulation,Java,C#,Bit Manipulation,我得到了一段用C语言编写的代码,我必须迁移到Java。在C#中,代码归结为: int foo = getFooValue(); UInt16 bar = 0x0080; if((foo & bar) == 0) { doSomeCoolStuff() } 既然java没有无符号的数字类型,我该如何在java中做到这一点呢?您不必担心无符号的类型,因为0x0080(十进制128)完全填充了short,其最大值为32767 public static void main(String

我得到了一段用C语言编写的代码,我必须迁移到Java。在C#中,代码归结为:

int foo = getFooValue();
UInt16 bar = 0x0080;
if((foo & bar) == 0)
{
  doSomeCoolStuff()
} 

既然java没有无符号的数字类型,我该如何在java中做到这一点呢?

您不必担心
无符号的
类型,因为
0x0080
(十进制
128
)完全填充了
short
,其最大值为
32767

public static void main(String[] args)
{
    short flag = 0x0080;

    int foo1 = 128; // 0x00000080

    if ((foo1 & flag) == 0)
        System.out.println("Hit 1!");

    int foo2 = 0; // 0x00000000

    if ((foo2 & flag) == 0)
        System.out.println("Hit 2!");

    int foo3 = 27698; // 0x00006C32

    if ((foo3 & flag) == 0)
        System.out.println("Hit 3!");
}

// Output: Hit 2! Hit 3!

在这种特殊情况下,您可以使用
int
(即使它已签名)。@KlitosKyriacou是正确的。无符号int的思想是,它允许您将正值拟合为正常int值的两倍(即
uint16
65535
)。但是,在这种情况下,您的值是
128
,这绝对符合正常的
int16
,并且由于常量条是用十六进制定义的,并且仅用于逻辑运算,因此即使该值属于负区域,也无所谓。@ZakiAnwarHamdani实际上是这样,因为它与
int
进行比较。有符号的负短字符将在左侧扩展为两个字节的1,而无符号的负短字符将在左侧扩展为0。为什么还要使用任何“窄”类型?您可以在C#和Java中使用
int