首页 > 编程语言 >【Java】位运算

【Java】位运算

时间:2023-08-29 18:56:01浏览次数:36  
标签:右移 Java 运算 System 按位 println out

这几天刷了一个简单的编程题(将数字变成0的次数)(https://leetcode.cn/problems/number-of-steps-to-reduce-a-number-to-zero/comments/),发现有一种我意想不到的解题思路:位运算。

想起了,最开始上课用C语言学习时,学过位运算。说起位运算,自然要知道源码、反码、补码,这里就不赘述了(主要是我会了)。Java中是否有位运算?当然有。目录如下:

我的实际工作中,大多数情况下只运到了按位与、按位或,其他的似乎没有用到。按照计算机的机制,左移和右移会比加减乘除的效率高。

不过,以我个人的观点:在我有限的低级工作中,并没有因为使用的是加减乘除,而不是位移照成卡死。这种情况下,让别人更好理解的方式理解更重要。不过,务实基础,或者作为奇技淫巧,比赛和和人吹牛时,展示出来:我比多想到一种效率更高的方法,我基础比你好。

闲言少叙,接下来我们看看Java的位运算吧。

按位与(&)

System.out.println(5&3);        // 结果为1

 Why? 我们来进行二进制比较:

按位或(|)

Java代码如下:

System.out.println(5|3);        // 结果为7

 运行原理如下:

按位取反(~)

Java按位取反代码如下:

System.out.println(~5);        // 结果为-6

原理如下图:

按位异或(^)

异或:相同的取0 ,相反取1

JAVA的异或运算代码如下:

System.out.println(5^3);        // 结果为6

原理如下图:

左移(<<)

说道左移和右移,不知道有没有小伙伴和我一样,经常搞错方向。有时候会蒙圈。到底左移表示的是乘法,还是除法?想想看,你走在一条人生的分叉路上,有两条分别向左右的路。

所以,左移 << 和右移 >> 括号尖头的方向都是箭头的方向。左边是高位,往左移动,就是向更高更大的方向走,即相当于乘法;右边是低位,往右移动,就是向更低更小的方向走,即除法。

题外话:《闻王昌龄左迁龙标遥有此寄》的“左”,与左移的左意思相反。

Java 代码如下:

System.out.println(5<<2);       // 20 : 相当于5*(2^2)

运行的原理图如下:

 左移后,低位补0。

右移(>>)

Java代码如下:

System.out.println(5>>2);       // 1 : 相当于5/(2^2)

运行的原理图如下:

 被挤出去的1,不得不消失;高位补0。

无符号右移(>>>)

右移和无符号右移有什么区别?用正数做例子可能无法表示。那么用负数来表示吧。

 可以发现当负数的时候,右移高位补1,无符号右移高位补1。

至于为什么呢?(右移我们把它想象成除法,就能理解了。至于无符号右移,那么就把它当作-5的无符号数对应的正数,前面自然补0)

所以,java代码如下:

1 System.out.println(-5>>2);      // -2
2 System.out.println(-5>>>2);     // 1073741822

 

标签:右移,Java,运算,System,按位,println,out
From: https://www.cnblogs.com/luyj00436/p/17087127.html

相关文章

  • jmeter java请求
    importorg.apache.jmeter.config.Arguments;importorg.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;importorg.apache.jmeter.protocol.java.sampler.JavaSamplerContext;importorg.apache.jmeter.samplers.SampleResult;importjava.util.Array......
  • JavaBean的get、set方法引发的讨论
    一哥们发的一个被大家广泛认为蛋疼的帖子,如下: //设置成私有变量,有什么鸟用?难道是为了整个团队配合的时候告诉那些人这个变量不可以动吗?那是不是一个开发一个项目的时候这些修饰符是毫无意义的?privateStringcode;publicvoidsetCode(Stringcode){......
  • JAVA接口
    接口:是一种引用数据类型由interfacec定义只能包含常量和抽象方法不能被实例话接口需要被实现、继承,实现类/派生类:必须重写接口中的所有抽象方法一个类可以实现多个接口,用逗号分隔。接口可以继承接口 接口中成员的访问权限,默认就是public的,也之能是publi......
  • 20230627 java.net.URL
    介绍java.net.URLpublicfinalclassURLimplementsjava.io.SerializableURI是个纯粹的语法结构,包含用来指定Web资源的字符串的各种组成部分URL是URI的一个特例,它包含了用于定位Web资源的足够信息URL语法authority部分具有以下形式:[user-info@]host[:port]......
  • 20230627 java.net.URI
    介绍java.net.URIpublicfinalclassURIimplementsComparable,SerializableURI是个纯粹的语法结构,包含用来指定Web资源的字符串的各种组成部分URL是URI的一个特例,它包含了用于定位Web资源的足够信息URI语法URI具有以下句法:[scheme:]schemeSpecficPart[#fra......
  • 20230627 java.net.Socket
    介绍java.net.SocketpublicclassSocketimplementsjava.io.Closeable套接字(Socket)是网络软件中的一个抽象概念,负责启动该程序内部和外部之间的通信API构造器Socket()Socket(Proxyproxy)Socket(Stringhost,intport)throwsUnknownHostException,IOException......
  • 20230627 java.net.ServerSocket
    介绍java.net.ServerSocketpublicclassServerSocketimplementsjava.io.Closeable服务器套接字ServerSocket类用于建立套接字,accept用于告诉程序不停地等待,直到有客户端连接到这个端口。一旦有人通过网络发送了正确的连接请求,并以此连接到了端口上,该方法就会返回一个表......
  • 20230627 java.net.InetSocketAddress
    介绍java.net.InetSocketAddresspublicclassInetSocketAddressextendsSocketAddressAPI构造器InetSocketAddress(intport)InetSocketAddress(InetAddressaddr,intport)InetSocketAddress(Stringhostname,intport)publiccreateUnresolved创建未解析的I......
  • 20230627 java.net.InetAddress
    介绍java.net.InetAddresspublicclassInetAddressimplementsjava.io.Serializable因特网地址,是一串数字表示的主机地址(IPv4是4字节,IPv6是16字节)支持在主机名和因特网地址之间进行转换封装了一个字节序列(IPv4是4字节),byte的取值范围是[-126,125),IPv4的大小......
  • 20230627 java.nio.channels.SocketChannel
    介绍java.nio.channels.SocketChannelpublicabstractclassSocketChannelextendsAbstractSelectableChannelimplementsByteChannel,ScatteringByteChannel,GatheringByteChannel,NetworkChannelAPIopen打开一个套接字通道,并将其连接到远程地址bindconne......