zoukankan      html  css  js  c++  java
  • Java按位取反运算符“~”的工作原理

    说明:本文参考了文章《Java按位取反运算符“~”》,链接:https://blog.csdn.net/smilecall/article/details/4245447


     补充:位运算符(~、&、|、^,<<、>>)都是在补码(计算机存储的形式)上操作。(原答案如下)


     1.二进制数在内存中是以补码的形式存放的;补码首位是符号位,0表示此数为正数,1表示此数为负数

    如:
    正数9——>具有符号位的二进制原码01001(首位表示符号位)——>补码01001((第2条会讲补码怎么来的)——>在内存中的形式0***1001(*表示无效位,其数量取决于分配的内存空间

    负数-1——>具有符号位的二进制原码11(首位表示符号位)——>补码11(第2条)——>在内存中的形式1***1(*表示无效位)

    2. 正数、负数的补码是什么?

    ①正数的补码、反码都是其二进制本身,只是需要在首位填加0,作为符号位。

    如:

    正数9——>二进制01001(首位表示符号位的二进制形式)——>补码01001(不变)

    ②负数的反码:符号位1不变,后面有效位数全部取反(有效位是指该数的无符号二进制位,如9的有效位指1001,-1的有效位指1);

     负数的补码:其反码再加1得到,即原码通过符号位不变,且有效位按位取反再加1也可得到;

    如:

    负数-1——>二进制原码11——>反码10(符号位1不变,后面有效位数全部取反)

    负数-1——>二进制原码11——>补码11【反码的有效位加1(此处不考虑符号)或者是原码符号位不变,有效位按位取反再加1】
    3. 计算机输出内存数据方式
    将内存中的补码转换成原码,进行显示;
    例如:
    正数9——>内存中补码0***1001——>转换成原码0***1001(不变)——>输出+9
    负数-5——>内存中补码1***011——>转换成原码1***101(补码中符号位后面的有效位减1,再取反,即负数补码的逆过程)——>-5
    4. 按位取反运算符“~”的原理
    按位取反运算符是将内存中的补码按位取反(包括符号位)
    例如:
    9(在内存中以补码0***1001存放)——>按位取反操作“~”——>变成补码1***0110(这明显变成了一个负数补码,因为符号位是1)——>输出时:补码减1,再取反得到原码1***1010——>输出-10
    -1(在内存中以补码1***1存放)——>按位取反操作“~”——>变成补码0***0(这明显是正数补码,因为符号位是0)——>输出时:得到原码0***0——>输出0

    注:所有的取反操作、加1、减1操作,都在有效位进行;***代表的无效位,分析时不要管。

  • 相关阅读:
    leetcode------Remove Element
    leetcode------Merge Two Sorted Lists
    [转载]Unity3D 游戏引擎之使用C#语言建立本地数据库(SQLITE)
    [转载]VS2012创建MVC3项目提示错误: 此模板尝试加载组件程序集 “NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”。
    [转载]Unity3D 访问Access数据库
    [转载]C#导入XLS数据到数据库
    [转载]Unity3D的断点调试功能
    [Unity3D]支持的视频格式
    unity 3d 获取鼠标当前坐标
    [转载]VS2012程序打包部署详解
  • 原文地址:https://www.cnblogs.com/pxb2018/p/9765849.html
Copyright © 2011-2022 走看看