我使用该~
操作进行位操作,我只是想知道Java如何计算负数?
我检查了Java文档:
"一元按位补码运算符"〜"反转位模式;它可以应用于任何整数类型,使每个"0"为"1",每个"1"为"0".例如,一个字节包含8位;将此运算符应用于位模式为"00000000"的值将其模式更改为"11111111"."
那么,如果int a = 60 (0011 1100)
,那么int c = ~a (1100 0011)
.
问题是,Java如何计算负数以便1100 0011 = -61
?1100 0011
计算的唯一方法-61
是
-2^6 + 2^1 + 2^0 = -61
.但这对我来说毫无意义.
And*_*san 12
假设最高位是简单符号位是错误的.Java以及大多数现代编程语言(和硬件架构)使用所谓的二进制补码表示数字.(巧合的是,这个位本身确实表示符号,但不是你所期望的那样,即150和-150比它们的表示中的符号位有更多的差异.)
这个表示首先看起来似乎是一个奇怪的选择,但它实际上使得诸如向负数(或其变体)添加正数的操作自动地工作,而不使处理器必须检查特殊情况.
根据维基百科的相关文章:
该系统可用于简化计算机硬件上的算术实现.首先添加0011(3)到1111(-1)似乎给出了10010的错误答案.但是,硬件可以简单地忽略最左边的位来给出0010(2)的正确答案.仍然必须存在溢出检查以捕获诸如求和0100和0100之类的操作.因此,系统允许添加负操作数而没有减法电路和检测数字符号的电路.此外,该加法电路还可以通过取一个数的二进制补码(见下文)来执行减法,这只需要一个额外的周期或它自己的加法器电路.为了执行此操作,电路仅假装存在额外的最左位1.
请参阅此相关答案,以获得更加深入的解释,其中包含许多简单易懂的示例.