一,基础知识

计算机中数值的编码方式中,原码、反码、补码。

正数的补码与原码相同,负数的补码为:负数的原码符号位不变,其它位取反,再加1。

在计算机中,数值是以补码的形式存储的。补码的好处:

①用补码存储可以减化电路设计,因为它可以将减法转换成加法,简化运算规则,将加减法统一起来了。

②还可以不用考虑符号位,解决了0的两种表示方式:比如,在原码中0的表示有 +0 和 -0

+0=[0000 0000 0000 0000 0000 0000 0000 0000]

-0=[1000 0000 0000 0000 0000 0000 0000 0000]

而用补码表示时,[0000 0000 0000 0000 0000 0000 0000 0000]用来表示0,而[1000 0000 0000 0000 0000 0000 0000 0000]用来表示 -2^32

这也是为什么我们看到JAVA中int型的数值范围为[-2^32  , 2^32-1]的原因。可表示的负数比可表示的正数多了一个。这个多出来的负数就是用原码中的-0 来表示 -128

二,JAVA中int型的最大值、最小值表示

在JAVA中,int型整数是用32个bit来表示的。最高位为符号位。下面都是以32bit的数值进行举例。

因此,JAVA中最大值int型整数为: (1<<31)-1,值为:2^32-1。它在内存中存储的形式为补码形式:[0111 1111 1111 1111 1111 1111 1111 1111]补  

JAVA中最小的int型整数可用 1 移位得到: (1<<31),值为:-2^32。它在内存中的形式为补码形式:[1000 0000 0000 0000 0000 0000 0000 0000]

此外,java.util.BitSet类也可以进行一些与 位 相关的操作。

三,负数的模操作(求余%)

当 x < 0 时,负数的取模操作如下:

x mod y = x - (<x/y>)

x % y = x 减去 (y 乘上 x与y的商的下界).<x/y>表示 x/y 的下界

四,JAVA 位操作的应用

这里演示异或操作的一个简单应用

①任何 int 型整数 与 0 异或 得到该整数本身

②任何 int 型整数 与 自己本身异或 得到 0

举例: 3^4^5^4^5 = 3

因为:3^4^5^4^5 = 4^4^5^5^3=3 (4^4=0,5^5=0,0^3=3)

根据以上两个性质,可以求解这个问题:

给定一个数组,除了一个元素,其它每个元素都出现了两次,找出这个出现一次的元素。时间复杂度O(n), 空间复杂度O(1).(链接)

同样,也可以类似地求解这个问题:

给一个长度为 n-1的数组,数字的范围在 1到 n(无重复),其中有一个缺失的数字,找出该数字。要求时间复杂度为O(n),空间复杂度为O(1).(链接

思路就是,0 与该数组中的所有元素进行异或,再与 1,2,3,……n 异或。这样,那个缺失的数字在异或操作中只出现一次。异或的最终结果即为那个缺失的数字。

如:3^4^5^4^5 = 4^4^5^5^3 =3(4^4=0,5^5=0,0^3=3)

代码如下:

 public class Solution {
public static int singleNumber(int[] nums) {
int ans = 0;
int i = 0;
for(;i < nums.length; i++)
ans = ans ^ nums[i] ^ (i+1);
return (ans^(i+1));
} public static void main(String[] args) {
int[] nums = {3,4,1,5,7,6};
int r = singleNumber(nums);
System.out.println(r);//2
}
}

五,参考资料

关于原码、补码、反码、求余参考

关于JAVA位操作应用参考:Java位操作全面总结

JAVA 位操作学习的更多相关文章

  1. Java的学习之路

    记事本 EditPlus eclipse Java的学习软件,已经系统性学习Java有一段时间了,接下来我想讲一下我在Java学习用到的软件. 1.第一个软件:记事本 记事本是Java学习中最基础的编 ...

  2. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  3. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  4. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  5. 20145213《Java程序设计学习笔记》第六周学习总结

    20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...

  6. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Java多线程学习(转载)

    Java多线程学习(转载) 时间:2015-03-14 13:53:14      阅读:137413      评论:4      收藏:3      [点我收藏+] 转载 :http://blog ...

  8. java基础学习总结——java环境变量配置

    前言 学习java的第一步就要搭建java的学习环境,首先是要安装JDK,JDK安装好之后,还需要在电脑上配置"JAVA_HOME”."path”."classpath& ...

  9. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

随机推荐

  1. 软件测试为何我会首选Python

    对于软件测试选择什么样的语言去学习,不同的人有不同的回答,为什么我会首选Python呢?这就要从Python的特点与适应领域说了. 一.Python的特点:优雅.明确.简单. 二.Python适合的领 ...

  2. java中多态的实现机制

    多态的概念: 简单来说就是事物在运行过程中存在的不同状态,即父类或接口定义的引用变量指向子类或具体实现类的实例对象.程序调用方法在运行期才进行动态绑定,而不是引用变量的类型中定义的方法. 多态存在的前 ...

  3. 1065 A+B and C

    同样是一题会产生溢出的题,不同的是这个用大数类很麻烦,因为有负数的可能性 不妨利用溢出的特性来解题:两个整数和为负数 或者 两个负数和为正数,那么就溢出了. #include<bits/stdc ...

  4. 每日scrum(6)

    今天是小组正式冲刺的第六天,软件的各种结尾工作,还有一些模块就已经全部实现了: 遇到的问题主要是对于自己能力的担忧,以前总是想,如果自己努力,就会怎样成功,其实并不是那样,小小的距离就是很远的能力差距 ...

  5. Alpha冲刺第4天

    Alpha第四天 1.团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504 陈顺兴 031602505 张胜男 031602540 廖钰萍 031602323 雷光游 03160 ...

  6. bash基本功能 -命令的别名和快捷键

    命令的别名 == 人的小名 如何查看和设定别名 alias 查看系统中的所有别名 ls --color=auto alias ll = 'ls - l --color=auto' touch abc ...

  7. 解决SVN安装语言包后无法选择中文的问题(亲测可行)

    TortoiseSVN_1.8.8安装后无法选择简体中文,或者安装语言包后也无法选择中文 1.找到 SVN 安装目录,把里面的Languages文件夹删掉 2.安装语言包,百度一下也有很多安装包和语言 ...

  8. SPFA最短路算法

    SPFA是改良后的BellmanFord(在刘汝佳的入门经典2上,甚至直接将SPFA归为BellmanFord的队列优化版本). 这是算法的伪代码 d[s] = 0, 其余d[?] = INF; 将s ...

  9. 【刷题】BZOJ 4945 [Noi2017]游戏

    Description http://www.lydsy.com/JudgeOnline/upload/Noi2017D2.pdf Solution 字符串里的'x'看起来很烦,于是考虑枚举这些'x' ...

  10. Python3中的编码问题

    编码方式介绍 我们首先来熟悉一下常见的一些编码方式,按照时间轴来划分,共有以下几种编码方式(常见): ASCII编码方式:对127个常见字符进行编码,其中包含了10个阿拉伯数字,共52个大小写英文字母 ...