~ 非运算操作


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 的原码)  
// 总结:  ~  非运算 ,即对 一个数字的二进制(计算机用补码表示数字)  进行各位取反。   最终这个获取的值表示哪一个数字 则需要对结果再求其相应的原码 才能看出来。