简单的问题 - 在 Java 中更改位

Roe*_*e84 1 java

我有一个简单的问题 - 我需要为我的程序编写一个函数来更改给定字节的第 3 位。

我写了这些行:

public byte turnOn(Byte value)
{
    int flag = 8;
    value = (byte) (value | flag);
    return value;
}
Run Code Online (Sandbox Code Playgroud)

我不确定这是否是正确的方法,因为我也看到了这种方式(我不熟悉)

value = (byte) (value | (1 << 2) );
Run Code Online (Sandbox Code Playgroud)

哪种方式更好, 1 << 2 是什么意思(2 表示第三位,但 1 是什么)

谢谢!

Ric*_*arn 5

1 << 2表示 1 向左移动两位。由于左移一位类似于乘以 2,因此结果为 4。在二进制中,这是

00000100
Run Code Online (Sandbox Code Playgroud)

即从右数第 3 位被设置。

使用常量1是因为该数字只有一个位集 - 最右边的位。左移后,只设置第 3 位(从右起):

00000001 original value
00000010 after shifting left once
00000100 after shifting left again
Run Code Online (Sandbox Code Playgroud)

我更喜欢使用1 << 2而不是像 一样的常量8,因为它可以更清楚地说明正在设置的位。它还可以防止您无意中使用设置了多个位的常量 - 当然,除非您确实需要。即便如此,为了清楚起见,我认为将几位加在一起会更清楚:

final int bitsToSet = (1 << 2) + (1 << 5);
Run Code Online (Sandbox Code Playgroud)