移位运算符简介:
首先,我们有左移运算符,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
and y
,如果新号码的位在任一中已打开,则将其设置为打开x
or y
,否则关闭:
1010 0101
| 1010 1010
---------
1010 1111
您应该只需要前面的运算符来解决手头的问题,但为了完整起见,这里是最后两个:
按位与运算符,x & y
当且仅当两个中的该位均打开时,才将输出中的位设置为 1x
and y
:
1010 0101
& 1010 1010
---------
1010 0000
按位异或运算符,x ^ y
如果该位在一个数字或另一个数字中打开,但不是同时打开,则将输出位设置为 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 ^
当然,我会留给您将其应用到您的工作中。