






















数学里 减去一个数等于跟它的负数相加 所以计算机底层其实只有加法器没有减法器 可以将要减去的值转换成它的负数形式 然后用加法器进行相加
以Java的int类型为例 它32位 第1位是符号位 0是表示是正的 1表示是负的 其余31位表示值的大小 数值范围为 - 2^31 到 2^31 - 1 (0占去了一个位置) 超出范围是发生溢出 需要像Hashmap求槽位那样取模取余数 除数为 2^32 因此对于int类型的 i 和 j来说 i - j = i - j + 2 ^32 两者用int来表示 是一样的
假如 j 是正整型 其二进制表示为 0 ? ... ? 0代表其为正数 2 ^ 32 - 1 的二进制表示是32位1 那么2 ^ 32 - 1 - j 在二进制运算里 假设 j 的二进制表示的第n位为1 那么2 ^ 32 - 1 - j 结果的第 n 位就是0 如果j的第 n 位为 0 那么2 ^ 32 - 1 - j 结果的第 n 位就是1 因此2 ^ 32 - 1 - j 相当于对 j 除了符号位外全都取反
负j的二进制表示为 1 ? ... ? 除了符号位 后面那串跟j完全相同 将后面那串用a表示 那么 j 为 0..a 负 j 为 1.. a 负数的反码为除符号位外 其他位置全部取反 那么负j的反码为1..(对a取反) 而2 ^ 32 - 1 - j 的第一位是1 剩下部分是除了符号位外对j取反 因此2 ^ 32 - 1 - j 可以表示为 1..(对a取反) 所以负j的反码就是 2 ^ 32 - 1 - j
所以 i - j = i - j + 2 ^32 = i + (2 ^32 - 1 - j) + 1 = i + 负j的反码)+ 1 把负 j 的 反码 + 1定义为 负j 的补码 那么i - j 就等于 i + (负j的补码 ) 所以无论遇到减法 得到其负数的补码再相加就行
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。