简单的问题 - 改变java中的位

时间:2011-06-05 15:01:58

标签: java

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

我写了这些文字:

public byte turnOn(Byte value)
{
    int flag = 8;
    value = (byte) (value | flag);
    return value;
}

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

value = (byte) (value | (1 << 2) );

哪种方式更好,1&lt;&lt;&lt; 2表示(2表示第三位,但是1表示)

谢谢!

3 个答案:

答案 0 :(得分:3)

二元¹中的4(或1 <1)是00000100。使用此掩码进行ORing可设置第三个最低有效位(或一个字节中的第五个有效位)。

8(或1 <1)是二进制的00001000,因此您要设置第四最低有效位(或一个字节的第五个)。 / p>

使用哪个表达式并不重要,移位只是表明你正在使用位掩码。或者,您可以使用十六进制0x04(imho)更容易转换为二进制位掩码。

1前导零不会更改该值,但应简化计算字节中设置位的位置。

答案 1 :(得分:3)

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

00000100

即。设置了右边的第3位。

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

00000001 original value
00000010 after shifting left once
00000100 after shifting left again

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

final int bitsToSet = (1 << 2) + (1 << 5);

答案 2 :(得分:1)

(1 << 2)会将值1左移两次。通常,(x << y)表示x * (2 ^ y)。所以1 << 2是4。

一般来说,使用bit-shift或bit-set方法无关紧要。编译器应该优化任何一种方式。

那就是说,你是在寻找第3位,从0开始索引还是从1索引?如果您正在寻找从索引1开始的第三个最右边的位,您希望flag为4而不是8.此外,|运算符是set-value运算符。如果你真的想“改变”这个位,你想使用^运算符 - 按位异或 - 这是切换值运算符。

这有意义吗?