java ~ 非运算操作
看源码ThreadPoolExecutor 源码时,看到了这么一段
~ 非运算符自己编程的时候用的比较少,于是就验证了一下这个运算符。
//https://blog.csdn.net/wenxinwukui234/article/details/42119265 关于补码,我的总结是: 补码巧妙的运用了“进位丢失” 使得补码运算满足 -x + x = 0 ,这样计算机可以只进行加法运算 不用额外引入减法逻辑,提高运算效率。
public static void main(String[] args) {
System.out.println(~(-6) );// ~ 非运算后的 结果 5
System.out.println(~(0) );//-1
System.out.println(~(3) );//-4
// 将数字转换成二进制表示,计算机表示二进制数字 使用的是补码。
// 正数的补码就是原码。 对于负数: 补码 = 原码除了符号位之外 各位取反 + 1 . 原码 = 补码除了符号位之外 各位取反 + 1
System.out.println( Integer.toBinaryString(-6)); // 打印的值,即-6的补码 11111111111111111111111111111010
System.out.println(Integer.toBinaryString(0)); // 0
System.out.println(Integer.toBinaryString(3));//11
}
//对 11111111111111111111111111111010 各位取反 得到 00000000000000000000000000000101 既可得到 5 的补码 。(也是5原码)
//对 0 各位取反 得到 11111111111111111111111111111111 是一个补码 , 然后除了符号位 各位取反后+1 得到 10000000000000000000000000000001 (即是 -1的原码)
// 对 00000000000000000000000000000011 各位取反得到 11111111111111111111111111111100 取反+1 得到 10000000000000000000000000000100 (即-4 的原码)
// 总结: ~ 非运算 ,即对 一个数字的二进制(计算机用补码表示数字) 进行各位取反。 最终这个获取的值表示哪一个数字 则需要对结果再求其相应的原码 才能看出来。