`

Java位操作(转载)

 
阅读更多

摘自: http://developer.51cto.com/art/200804/69978.htm

 

【引自黑马王子 的博客】Java中的位操作指定包括:


~ 按位非(NOT)
& 按位与(AND)
| 按位或(OR)
^ 按位异或(XOR)


>> (逻辑)右移
>>> 无符号右移
<< (逻辑)左移


前面几个都非常简单,主要是移位操作比较容易出错.
首先要搞清楚参与运算的数的位数,如int的是32位。long的是64位。
如int i = 1;
i的二进制原码表示为:
00000000000000000000000000000001
long l = 1;
l的二进制原码表示为:
0000000000000000000000000000000000000000000000000000000000000001


二、

正数没有反码、补码,也可以说正数的反码、补码跟原码一样。
负数的反码为原码逐位取反,
如int i = -1;
10000000000000000000000000000001,最高位是符号位。正数为0,负数为1。
逐位取反后:
01111111111111111111111111111110即反码。
反码加1:
01111111111111111111111111111111即补码。
负数都是用补码参与运算的。得到的也是补码,需要减1取反获得原码。

三、常用的位运算符--0在位运算中是比较特殊的。

^ 异或。 相同为0,相异为1; 任何数与0异或都等于原值。 
& 与。 全1为1, 有0为0;任何数与0异或都等于0。
| 或。 有1为1, 全0为0。任何数与0或都等于原值。
<<左移。 补0。
>> 右移。 符号位是0补0,是1补1。
>>>无符号右移。补0。
~ 非 逐位取反

 

四、负数参与的运算,得到的是补码,需要将补码先减1,然后逐位取反,得到原码。即为运算结果。

0例外,如果得到的是0,则不需减1和取反。
另外,两个正数运算后得到的就是原码,不需减1和取反。
举例:
1^-1,
-1
10000000000000000000000000000001--原码
01111111111111111111111111111110--反码 (注:连符号位一起变反
01111111111111111111111111111111--补码
1
00000000000000000000000000000001--原码
则1^-1等于
01111111111111111111111111111111^
00000000000000000000000000000001=
01111111111111111111111111111110--补码
01111111111111111111111111111101--反码
10000000000000000000000000000010--原码==-2
即1^-1=-2
举例:
1^-2
-2
10000000000000000000000000000010--原码
01111111111111111111111111111101--反码
01111111111111111111111111111110--补码
1
00000000000000000000000000000001--原码
则1^-2等于
01111111111111111111111111111110^
00000000000000000000000000000001=
01111111111111111111111111111111--补码
01111111111111111111111111111110--反码
10000000000000000000000000000001--原码==-1

 


1.<<
逻辑左移,右边补0,符号位和其他位一样.
正数:
x<<1一般相当于2x,但是可能溢出.
溢出范围: 230~(231-1) 二进制表示 010000...000到01111....1111,移位后最高为变为1了,变成负数了.
负数:
x<<1一般也相当于2x,也有可能溢出.所以, x*32可以写成x<<5
溢出范围: -231~-(230+1)二进制表示10000...000到101111...1111,移位后最高为变成0了,变成正数了.


2.>>
算术右移,和上面的不对应,为正数时左边补0,为负数时左边补1.
x>>1,相当于x/2,余数被舍弃,因为这个是缩小,所以不会溢出.
不过有一点要注意: -1右移多少位都是-1.

                ==> Sam: 数字在计算机中用原码表示,只有计算时才临时变为补码运算,得到结果后马上转会原码

 

另外舍弃的余数是正的, 3>>1=1 舍弃的余数是1.
-3>>1=-2 舍弃的余数也是1,而不是-1.

 

对于正数 x>>1和x/2相等
对于负数 x>>1和x/2不一定相等.


3.>>>
逻辑右移,这个才是和<<对应的
这个把符号位一起移动,左边补0
对于正数,>>>和>>是一样的
对于负数,右移之后就变成正数了.
可以使用Integer.toBinaryString(int i)来看01比特 ,更加直观.
考虑下面的代码:
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码:
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
修改后的代码不再做乘以8的操作,而是改用等价的左移3位操作,每左移1位相于乘以2。相应地,右移1位操作相当于除以2。值得一提的是,虽然移位操作速度快,但可能使代码比较难于理解,所以最好加上一些注释。


无符号右移位操作符“>>>”在将bit串右移位时,从bit串的最左边填充0,这和带符号右移位操作符 “>>”不同。“>>”在将bit串右移位时,从bit串的最左边填充原来最左边的位。也就是说,bit串原来最左边的位是符号位,如果为1,则在带符号右移时最左边始终填充1;如果为0,则在带符号右移时最左边始终填充0。

移位操作符的例子见下表。

操作 结果 说明
00110010 << 2 11001000 右边始终填充0
00110010 >> 2 00001100 结果一样
00110010 >>> 2 00001100
10110010 >> 2 11101100 结果不同
10110010 >>> 2 00101100


“按位与”操作符“&”对两个bit串按位进行逻辑与,“按位或”操作符“|”对两个bit串按位进行逻辑或,“按位异或”操作符“^”对两个bit串按位进行异或操作。运算规则如下表所示。

按位与 按位或 按位异或
0 & 0 = 0 0 | 0 = 0 0 ^ 0 = 0
0 & 1 = 0 0 | 1 = 1 0 ^ 1 = 1
1 & 0 = 0 1 | 0 = 1 1 ^ 0 = 1
1 & 1 = 1 1 | 1 = 1 1 ^ 1 = 0
分享到:
评论

相关推荐

    java 时间转换(转载)

    `java.time`包提供了许多方便的方法来进行日期时间的加减操作,比如`plusDays()`, `minusHours()`, `withYear()`等。 6. **日期比较**: `LocalDateTime`、`LocalDate`等类提供了`isBefore()`, `isAfter()`, `is...

    如何学习Java(转载某位经过锤炼而成为高手的同行)

    本文将根据一位资深Java程序员的经验分享,为初学者提供一条清晰的学习路径,帮助大家在Java之旅中少走弯路,加速成长。 #### Java的三大领域:J2SE、J2ME与J2EE Java自问世以来,其应用范围广泛,涵盖桌面应用、...

    JAVA文章精选542个(txt) 免费分享

    可能涉及JPA(Java Persistence API)或Hibernate等框架,讲解如何创建实体类,配置映射文件,以及执行CRUD操作。 2. **转:第一部分:EJB 体系结构的历史和目标.txt**: EJB(Enterprise JavaBeans)是Java EE...

    Java 9 High Performance

    Mayur Ramgir不仅有16年以上的软件行业工作经验,还是一位Sun认证的Java程序员,其丰富的经验无疑增加了该书的权威性和实用性。 《Java 9 High Performance》可能覆盖了以下几个关键领域: 1. Java平台模块系统...

    Java字节码(.class文件)格式详解((转载)

    此外,还有一些工具,如JBE(Java Bytecode Editor),可以用于编辑和调试字节码,这对于深入学习JVM的工作原理和进行代码混淆等高级操作非常有用。 在提供的文件中,`Java字节码(一).docx`和`Java字节码(二).docx`...

    Java基础知识及面试题.pdf

    表达式运算符和操作数按照一定的规则组成的语句,包括赋值运算符、比较运算符、相等运算符、位运算符、逻辑运算符和条件运算符。 12. 变量的作用域 变量的作用域包括类的成员变量、局部变量、方法的参数和异常的...

    信息类网站源码-转载

    涉及到数据库操作和分类结构的设计。 10. **edit_user.asp**:用户编辑个人信息的页面,用户可以更新他们的资料、密码等。需要处理用户提交的数据更新请求,并确保数据安全。 以上是基于给定文件名推测的各个页面...

    Tomcat 7-9转载资源

    在Windows环境下,提供了x64和x86两种版本,分别对应64位和32位操作系统。对于64位系统,x64版本通常能更好地利用硬件资源,提高性能;而x86版本则可以兼容32位环境,但可能在处理大量数据时受到内存限制。 每个...

    13.小区物业管理系统-SpringBoot+ Mysql+Java+Tomcat设计与实现(可运行源码+数据库+开发文档+lw

    过计算机进行整体智能化操作,对于小区物业管理系统所牵扯的管理及数据保存都是非常多的,例如管理员;首页、个人中心、用户管理、员工管理、业主信息管理、费用信息管理、楼房信息管理、报修信息管理、车位信息管理...

    InterviewGuide:计算机校招,社招面试八股文整理,也是《逆袭进大厂》唯一仓库,目前已收录CC ++,操作系统,数据结构,计算机网络,MySQL,Redis等面试资料,未来打算继续收录Java,Python ,Go等面试常见问题,坚持进行仓库维护下去

    目前已收录C / C ++,操作系统,数据结构,计算机网络,MySQL,Redis等面试资料,未来打算继续收录Java,Python,Go等面试常见问题,坚持进行仓库维护下去。 :open_book:仓库建议 :folded_hands:本仓库脱胎于阿秀...

    leetcode下载-CodingInterviews:《剑指offer》面试题java版,leetcode题目分享

    java 版本,自己写的,个别题目和书中介绍的思路有出入,但是绝大多数是一致的。因为从头到尾都是自己手写的,难免出错,欢迎帮忙纠错。 转载算法实现请注明出处。 第二章 面试需要的基础知识 编程语言 数据结构 ...

    串口通信编程大全COM

    7. **编程语言支持**:各种编程语言都有相应的串口通信库,例如Python的pyserial,C#的System.IO.Ports命名空间,Java的java.io.SerialPort等。 8. **错误处理**:在编程中,必须考虑通信中断、数据错误、超时等...

    mysql安装配置教程.docx

    - 注意选择与操作系统位数相匹配的版本(32位或64位)。 #### 三、MySQL的安装 - **运行安装程序**: - 双击下载的MSI文件或运行MySQL Installer。 - 跟随安装向导进行操作。 - **安装类型选择**: - 可选择...

    linux 打so库

    这里提到的64位Ubuntu 12.04操作系统已经得到真机编译验证,显示出选择合适且经过测试的操作系统对开发工作的重要性。此外,安装JDK 1.6 SE是进行Android源码编译的必要条件。 Android系统的编译过程 在描述中,...

    SweetScape 010 Editor 8 汉化版

    20、能够以 十六进制文本、 C/C++ 代码、Java 代码、Intel 十六进制格式 (8, 16, 或 32 位版本)、或 Motorola S-Records (3 种类型)形式导入或导出数据。 21、打印操作支持完整的打印预览、页眉、页脚和页边距的设置...

    EditPlus211SR22.rar

    EditPlus 是 Internet 时代的 32 位文本编辑程序,HTML 编辑及程序员的Windows 平台编辑器。它可以充分的替换记事本,它也提供网页作家及程序设计师许多强悍的功能。对于 HTML、CSS、PHP、ASP、Perl、C/C++、Java、...

    廖雪峰python教程完整版且排好版的pdf文件

    在教程内容中提及的版权归属信息表明,该教程的所有权归原作者廖雪峰所有,任何对教程的转载、使用需遵守相应的版权法规。同时,原作者鼓励人们支持其工作,并提供了赞助链接。 知识点九:Python的哲学与社区 ...

    A20蜂鸟开发系统使用说明

    除此之外,还需要准备两台PC,其中一台用于编译代码,建议安装Linux操作系统,例如Ubuntu 12.04或Ubuntu 12.10(64位版本);另外一台PC则用于烧写固件,可安装Windows XP操作系统。连接这些设备需要使用串口线和USB...

    神秘代码-带你开启新世界的大门

    这不,美国的一位老哥Gant Laborde使用TensorFlow.js开发了一款是用深度学习技术在浏览器中识别“石头剪刀布”游戏手势的网页应用,放出了demo并将代码开源在了Github上。 对于JavaScript开发者来说,这是打开深度...

Global site tag (gtag.js) - Google Analytics