[英]Java split the bits of a long in two parts using bit shifting
在这种情况下,我需要将数字的位数9( 1001
)分成两个相等大小的部分10
和01
。
我的第一个想法是只是移动它,但对于正确的数字我没有得到预期的结果,我怀疑这是由于符号(在java :()中没有未签名的原因)。
我当前的代码如下:
long num=9;
System.out.println(Long.toBinaryString(num));
long num1=num>>2;
System.out.println(Long.toBinaryString(num1));
long num2=num<<2;
System.out.println(Long.toBinaryString(num2));
输出:
1001
10
100100
任何解决方法?
要获得较低的部分,您需要使用按位AND ...,因此,如果向右移位2位以获取较高的部分,则需要将二进制数为11(两位为1)进行AND以获得较低的部分。 下面的代码应该对任何转变进行处理:
long num = 9;
int shift = 2
System.out.println(Long.toBinaryString(num));
long num1 = num >> shift;
System.out.println(Long.toBinaryString(num1));
long num2 = num & ( (1<<shift) - 1);
System.out.println(Long.toBinaryString(num2));
计算num2
说明,对于shift
2,0b表示二进制文字,以伪代码表示:
( (1<<shift) - 1) == ( (1<<2) - 1) == ( 0b100 - 1) == 0b11 == two bits set
从中应该清楚它对于任何shift
值如何工作。
您可以将num1
移回2并从num
减去它。 这将给你num2
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.