要了解取反运算,首先需要知到一下几个概念:

1计算机中存储整数都是用的补码, 取反运算也是对补码进行取反。(当然一定要清楚,虽然我们一只都说求补码需对原码取反后加1,但是此取反和标题的取反运算有些不一样!!!取否者会混淆!!!)

标题的取反运算~是需要对计算机存储的补码的所有位进行取反。

求补码中取反加1是需要保留符号位的。这个取反代表求反码

否者总是纠结为什么负数取反的时候,不保留符号位。我们一定要记住“~”这个玩意儿对一个数进行操作的时候,是对其补码的所有位(包括符号位)进行取反。我们的目的在于要对这个数进行取反,而不是对这个数进行求反码或者求补码运算!!!

2.所有的数字大小都是根据原码的大小计算的,最终我们在JAVA程序运行结果框中看到的数值的大小,就是原码的大小。

3.正整数的反码,补码和原码相同,负整数的反码是除了符号位以外取反,负数的补码为反码+1

4.对补码再求补码即是原码

5.java中存储的数据的最高位为符号位,最高位为0,代表正数;最高位为1,代表负数。

---------------------------------------------------------------------------------------------------------------------------------

例如:

int a=10;
system.out.println(a);

当输出a时,显而易见,结果框中肯定显示10。

这个10,是我们能看见的,且是十进制数,将其转换为二进制原码为:

0000 0000 0000 0000 0000 0000 0000 1010      (int型有32位)

原码这么大一长串的值是和10相等的,这一点我们是没有异议的。

当然原码只能算是我们自己打草稿转换出来的数,而并非计算机存储的数,计算机只会存储10的补码。

当然,10是一个正数,所以,其原码、反码、补码都相同为:

0000 0000 0000 0000 0000 0000 0000 1010

对10进行取反运算 ~10,就相当于对10的补码的所有位进行取反,从而得到x的补码

设x=~10  (x为JAVA程序运行结果框中我们能看见的十进制数值的大小)

将0000 0000 0000 0000 0000 0000 0000 1010 取反后得

1111 1111 1111 1111 1111 1111 1111 0101

这串数字便是我们要求的x的补码,而并非和x值等大的原码。看最高位为1,所以x值为负数。

需要对其补码求补码,来的到x的原码。

对1111 1111 1111 1111 1111 1111 1111 0101求补码得(符号位不变,求其反码后加1)

补码的反码:1000 0000 0000 0000 0000 0000 0000 1010

补码的补码(即x的原码):1000 0000 0000 0000 0000 0000 0000 1011

将其转换为十进制后,即为x的值,其中最高位为1,代表负号-

其位的结果诶8+2+1=11

于是最终结果为-11

所以x的值,也就是我们JAVA运行结果框中展示的值就为-11

---------------------------------------------------------------------------------------------------------------------------------

接下来我们举一个负数取反的例子,对-10取反

设 int y=~(-10);

-10的 原码为:1000 0000 0000 0000 0000 0000 0000 1010 (最高位的1为负数)

对-10取反,就相当于对-10的补码取反

-10求补码:

求反码得:1111 1111 1111 1111 1111 1111 1111 0101(符号位保留,其余取反)

补码为:1111 1111 1111 1111 1111 1111 1111 0110(反码加1)

这样我们就得到了-10的补码了,但是我们的目的是对-10进行取反,得到真正的y的值。

所以对-10取反,相当于对-10的补码的所有位进行取反,得到y的补码。

对-10的补码取反得:0000 0000 0000 0000 0000 0000 0000 1001(这个便是y的补码)

看其最高位为0,所以其为整数,整数原码、反码、补码相同,所以其原码也是:

0000 0000 0000 0000 0000 0000 0000 1001

最终将原码转换为十进制的到y的值。最高位0代表+,可以不显示。

y=8+1=9

---------------------------------------------------------------------------------------------------------------------------------总而言之,

进行取反运算时(~)记住如下步骤:

1,如果是对 x1 进行取反 得x2

A. 求x1的补码。

(这个过程要保留符号位)且要记住正数补码、反码、原码相同。负数按保留符号位,其他位按位取反再加1正常运算即可。

B. 对x1补码的全部位进行取反

(这个过程符号位也要取反) 这个过程才是真正的“~”取反运算

之前每次算到B步骤,还总是在想,怎么突然不保留符号位了   *-*||

从而得到x2的补码。

C.求x2。

对B中得到x2的补码求补码,从而得到x2的原码,最后转换为十进制的x2。(这个过程符号位也要保留)

希望自己,也希望大家不要在搞混了。

JAVA学习记录(取反运算~)相关推荐

  1. java学习记录十五:集合二Collections、Set、Map

    java学习记录十五:集合二 一.Collections工具类 一.解释 二.常用方法 1.打乱集合顺序 2.按照默认规则排序 3.按指定规则排序 4.批量添加元素 二.可变参数 一.解释 二.写法 ...

  2. Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)

    Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...

  3. java多线程阶乘_【java学习记录】11.用多线程实现阶乘的计算过程和结果的读取(thread类ReadThread )...

    (源码在上传的压缩包"[java学习记录]11.多线程实现阶乘计算(Thread类和Runnable接口)"中可看到,该压缩包可下载)java * 采用Thread类的子类实现线程 ...

  4. java学习记录16-反射

    java学习记录 一.什么叫反射? 二.测试class类的创建方式有哪些 三.类加载内存分析 加载->链接->初始化 四.分析类的初始化 五.获得类的信息 六.动态的创建对象,通过反射 七 ...

  5. Java学习记录02

    Java学习记录02 在学习中,博客的书写不可缺少,相应的markdown基本语法也要掌握,下面是自己在CSDN上查找并学习的链接:Markdown语法 2.6项目实训:基于控制台设计简易打折与累加计 ...

  6. Java学习记录_1:MOOC《零基础学Java语言》课后习题解

    Hey,我是寒水,一名大二学生,电子商务专业在读,正在学习Java中.我试图将在Java学习中遇到的一些困惑和最终的解答发在这个账号上,希望以此来激励我不要放弃学习! 在学习记录这个专题中,我收藏一些 ...

  7. Java学习记录之简单的图书管理系统(完善中)

    电子书管理系统 功能划分 最核心的功能 提供图书管理的服务 添加图书 查询 检索所有的图书 按已知检索图书信息 图书的删除 图书信息的更新 用户 用户的类型 管理员:图书的添加.更新.删除操作 普通用 ...

  8. Java学习记录(Day4)

    学习Java第四天 单例模式 三元素: 构造结构私有化 静态属性指向实例 public static的 getInstance方法,返回第二步的静态属性 饿汉式单例模式 GiantDragon 应该只 ...

  9. JAVA学习记录DAY 14

    今天记录一下类与对象的基础知识. 类就是对象的所有特点和动作的总结,对象就是类的具体体现.假设熊猫是一个类,滚滚是某只熊猫,这只滚滚就应该具备熊猫所有的特点和行为,比如熊猫的毛发黑白相间那么滚滚就应该 ...

最新文章

  1. 哈希分布与一致性哈希算法简介
  2. 嵌入式ARM多核处理器并行化方法
  3. numpy.random.rand使用详解
  4. boost::statechart::in_state_reaction相关的测试程序
  5. schedule execution
  6. 弹窗时候禁止页面滚动
  7. 2010年终人生的思考
  8. python使用ddt找不到方法_python使用ddt过程中遇到的问题及解决方案【推荐】
  9. 简单人物画像_天天谈【用户画像】95%的人根本不知道自己在说什么
  10. 株洲市码高机器人编程_码高机器人教育
  11. 《Android 开发入门》我为什么要在Android找工作越来越难的时候开始学习它
  12. 虚拟机ubuntu系统硬盘扩容
  13. [译]ASP.NET Core 2.0 区域
  14. JAVA程序性能优化研究 - 循环内对象性能优化内容
  15. python怎么打开h5文件_h5文件python
  16. win10禁用全角_win10输入法全角半角怎么切换 快捷键使用教程
  17. 程序员在跳槽时,该怎么说离职原因?
  18. 每日一题:1.function Person(firstName, lastName) { this.firstName = firstName; this.lastName = lastNa
  19. scanner练习:BMI计算
  20. 关于X509证书和密钥的概念

热门文章

  1. 如何在Ubuntu 20.04上使用X2Go设置远程桌面
  2. 数据结构与算法之时间复杂度与空间复杂度
  3. 云服务器 ipv6,开通IPv6
  4. 【历史上的今天】3 月 22 日:iPod 之父出生;奔腾处理器正式出货;激光的第一项专利
  5. 矩阵与矩阵的乘法运算
  6. 3999美元掀价格战,Velodyne宣布16线激光雷达降价50%
  7. windows内网信息收集
  8. 新浪微博视频批量上传社区投稿工具教程
  9. hgame2023 week2 writeup
  10. 微信小程序获取定位后使用腾讯地图解析到市位置