位移运算符简介:
首先,我们有左移运算符 x << n
。这将把x
中所有的位向左移动n
位,并用零填充新的位:
1111 1111
<< 3: 1111 1000
接下来介绍有符号右移运算符x >> n
。这将右移x
中的所有位n位,将符号位复制到新位中:
1111 1111
>> 3: 1111 1111
1000 0000
>> 3: 1111 0000
0111 1111
>> 3: 0000 1111
最后,我们有了零填充右移操作符 x >>> n
。它将x
中的所有位向右移动n
位,并用零填充新位:
1111 1111
>>> 3: 0001 1111
您还可能会发现按位或运算符x | y
非常有用。它比较x
和y
中每个位置上的位,如果在x
或y
中任意一个位上为1,则设置新数字的该位为1,否则为0:
1010 0101
| 1010 1010
---------
1010 1111
你只需要使用前面的运算符来解决问题,但为了完整起见,这里提供最后两个运算符:
按位与运算符
x & y
仅当
x
和
y
中的位都为1时才将输出位设置为1:
1010 0101
& 1010 1010
---------
1010 0000
按位异或运算符
x ^ y
,如果两个数中的某一位只有一个为1,则将输出位设置为1:
1010 0101
^ 1010 1010
---------
0000 1111
现在,将这些应用到手头的情况:
您需要使用位移运算符来添加和操作位。按照它们的字符串表示从右侧开始设置位并将它们移位。一直持续到达字节末尾,然后移动到下一个字节。假设我们想要创建“1100 1010”的字节表示:
Our byte Target
--------- --------
0000 0000
1100 1010
0000 0001 ^
1100 1010
0000 0011 ^
1100 1010
0000 0110 ^
1100 1010
0000 1100 ^
1100 1010
0001 1001 ^
1100 1010
0011 0010 ^
1100 1010
0110 0101 ^
1100 1010
1100 1010 ^
当然,我会让您自行将其应用于您的工作中。
String
(“010100111111011000”)来表示一个7个字符长的单词(“program”)。你确定你的意思是什么吗?通常情况下,你会在X个字节中设置这些位(在这种情况下为3个字节)。 - Brian Roach>>
,>>>
,<<
。 - KevinString
,那么这就是混淆的根源。如果你有一个String
,你没有比特位。你有一堆字符0
和1
(具体来说,你有每个字符16位Unicode字符,使得你的内存使用36字节,在String
对象的开销之前)- 明确地说,如果你有一个String
,你有一组比特位的文本表示,使用字符0和1表示。 - Brian Roach