int nm = 5;
System.out.println(Integer.toBinaryString(nm)); // line 1
System.out.println(Integer.toBinaryString(~nm)); // line 2
第1行给出-->101
第2行给出-->11111111111111111111111111 010
我知道2号线输出的原因。
如果我只希望第2行输出为010(只是5(101)的补码,而不是5的32位表示的补码),该怎么办?
int nm = 5;
System.out.println(Integer.toBinaryString(nm)); // line 1
System.out.println(Integer.toBinaryString(~nm)); // line 2
第1行给出-->101
第2行给出-->11111111111111111111111111 010
我知道2号线输出的原因。
如果我只希望第2行输出为010(只是5(101)的补码,而不是5的32位表示的补码),该怎么办?
1条答案
按热度按时间33qvvth11#
你可以聪明一点
~nm
所有位中有1位的数字<=该数字的最高1位nm
. 如果是5
,你要有点智慧和智慧0b111
.通常,可以按以下方式计算遮罩:
这将打印
10
,而不是010
你想要的,自从0
省略了。说明:
Integer.numberOfLeadingZeros (nm)
会回来的29
什么时候nm == 5
,所以-1 >>> 29
会回来的0b00000..0111
.