我有一个简单的问题 - 我需要为我的程序编写一个函数来改变给定字节的第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表示)
谢谢!
答案 0 :(得分:3)
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运算符。如果你真的想“改变”这个位,你想使用^
运算符 - 按位异或 - 这是切换值运算符。
这有意义吗?