如何得到1的补码,而不是得到java中表示数字的所有32位的补码?

ykejflvf  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(330)
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位表示的补码),该怎么办?

33qvvth1

33qvvth11#

你可以聪明一点 ~nm 所有位中有1位的数字<=该数字的最高1位 nm . 如果是 5 ,你要有点智慧和智慧 0b111 .
通常,可以按以下方式计算遮罩:

System.out.println (Integer.toBinaryString ((-1 >>> Integer.numberOfLeadingZeros (nm)) & ~nm));

这将打印 10 ,而不是 010 你想要的,自从 0 省略了。
说明: Integer.numberOfLeadingZeros (nm) 会回来的 29 什么时候 nm == 5 ,所以 -1 >>> 29 会回来的 0b00000..0111 .

相关问题