当前位置: 首页 > news >正文

JAVA 位操作学习

一,基础知识

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

正数的补码与原码相同,负数的补码为:负数的原码符号位不变,其它位取反,再加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)

代码如下:

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

 

五,参考资料

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

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

 

相关文章:

  • idea演示
  • F5 实现pool池转发
  • ie7下a/a标签不反应
  • MapReduce编程实例
  • iOS开发数据库篇—SQLite简单介绍
  • iOS开发拓展篇—音效的播放
  • 基于COOKIE的点击流数据仓库构建思路(一)
  • Tomcat热部署和虚拟目录配置
  • 被遗忘的Logrotate
  • 压合细节
  • windows下安装python科学计算环境,numpy scipy scikit ,matplotlib等
  • IC卡的传输协议(2)-块传输协议T=1续【转】
  • Elasticsearch 2.3.0 老版本升级指南
  • java web
  • Office online server 部署
  • 【mysql】环境安装、服务启动、密码设置
  • CentOS7 安装JDK
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • JavaScript实现分页效果
  • JS函数式编程 数组部分风格 ES6版
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • LeetCode算法系列_0891_子序列宽度之和
  • Service Worker
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用 QuickBI 搭建酷炫可视化分析
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​queue --- 一个同步的队列类​
  • #pragma pack(1)
  • (1)bark-ml
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2)STM32单片机上位机
  • (C#)获取字符编码的类
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (六)激光线扫描-三维重建
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (转)重识new
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • ***通过什么方式***网吧
  • *上位机的定义
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .gitattributes 文件
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET 5种线程安全集合
  • .NET CLR Hosting 简介
  • .net开发引用程序集提示没有强名称的解决办法
  • .NET使用存储过程实现对数据库的增删改查
  • .project文件
  • @property @synthesize @dynamic 及相关属性作用探究
  • @vue/cli 3.x+引入jQuery
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器