一、不该被遗忘的移位位运算

本文主要介绍移位运算(Shift Operation), 适当介绍一下其它相关的位运算。

甭说计算机刚发明那会,就连21世纪初那段日子,计算机内存都是KB/MB计算的。编写的程序需要充分考虑计算机的储存容量,好的程序必须是执行效率高,代码精炼,占用资源尽可能少,不容许任何的浪费。可想而知,那个时候位运算带来的运行性能上的提升和内存资源消耗降低是多么重要。

现如今计算机行业高速发展,位运算带来的高效率等优势已经被整体硬件水平的质变所冲淡,但是为什么我们还要学习掌握位运算呢?答案就两个字:装逼。这就像图形界面已经这么发达了,为什么我还是会用shell一样,无非就是显摆

二、移位运算案例

 /**
* Java移位运算:
* 1)带符号左移 <<
* 2)带符号右移 >>
* 3)无符号右移 >>>
*
* 注意点:
* 1)本案例使用字面量10,默认为int型
* 2)Java移位运算不支持小数
*/
public class ShiftOperation {
public static void main(String[] args) {
// 正整数的带符号左移(0000_0000_0000_0000_0000_0000_0000_1010)B << 2
System.out.println(10 << 2); // 40
// 负整数的带符号左移 (1111_1111_1111_1111_1111_1111_1111_0110)B << 2
System.out.println(-10 << 2); // -40 // 正整数的带符号右移(0000_0000_0000_0000_0000_0000_0000_1010)B >> 2
System.out.println(10 >> 2); // 2
// 负整数的带符号右移 (1111_1111_1111_1111_1111_1111_1111_0110)B >> 2
System.out.println(-10 >> 2); //-3 // 正整数的带符号右移 (0000_0000_0000_0000_0000_0000_0000_1010)B >>> 2
System.out.println(10 >>> 2); // 2
// 负整数的带符号右移 (1111_1111_1111_1111_1111_1111_1111_0110)B >>> 2
System.out.println(-10 >>> 2); // 1073741821
}
}

这些运算有人做过规律总结,甚至还有公式,但是我个人不推荐,记住了又能怎么样呢。任何东西,只要能从本质上理解,这就说明你已经完全掌握了,公式只不过为了应付考试而已,没有任何实际意义。

三、移位运算原理简单探究(参考教材学习)

首先,问一个问题:为什么Java移位运算没有无符号左移运算符(<<<)?

但凡非生活琐事,常问为什么对自身综合素质的提高大有裨益。这个问题近1年前我想过,今天也给大家分享一下。

1111_1111_1111_1111 << 2 结果:1111_1111_1111_1100
1111_1111_1111_1111 <<< 2 结果:1111_1111_1111_1100
结果完全相同,能少写一个<符号,何乐而不为呢 1111_1111_1111_1111 >> 2 结果:1111_1111_1111_111 负数带符号右移仍为负数
1111_1111_1111_1111 >>> 2 结果:0011_1111_1111_1111 负数无符号右移变成正数

说段题外话,十几天前,有同学晒了一张和众多书籍的合影,并说自己好像拥有好多知识。我回复了一条评论,有书籍并不代表有知识,有知识并不代表有文化,有文化并不代表有教养。其实,教育本身并不是等于教授知识,重要的是在于知识背后的思想。举些切合本节主题的例子,奥斯特发现电生磁,法拉第利用对称思想想到磁生电;麦克斯韦直到变电场可以产生变磁场,于是假设变磁场也可以激发变电场,于是有了电磁波的发现。

看到Java有>>>却没有<<<,这么奇怪,其实我们应该多去探究背后设计者是基于什么考虑的,或者你认为是基于什么考虑的。


移位运算的原理其实不难,真正略难的是从电路的角度来理解,在代码层次只要知道其运算规则即可。至少明确以下几点:

1)计算机中保存数据使用的是补码,正数的补码等于其原码、反码,负数的补码值上等于其反码加1。

2)原码和反码是非符号位按位取反。

3)正数符号位为0,负数符号位为1。

4)小数不能使用Java移位运算符进行运算。

5)带符号移位,左移右侧补0,右移左侧补符号位;无符号右移,左侧补0。

四、核心类库中移位运算案例

下面选择的是HashMap类中的一个方法。既有移位运算,又有异或运算,有兴趣的读者可以研究一下,今后会在集合框架专题中专门对HashMap类分析,尽请期待。

在Java源代码中大量用到了移位运算,比如二分搜索算法等等,应该引起注意。

五、简述Java中存在的位运算

Java位运算除了移位运算外,还有按位与(&)、按位或(|)、按位异或(^)、非(~)运算。能否运算符的有效使用,足够看出一个人的基本功。当然,如果要灵活运用这些操作符,需要对计算机底层有所了解,以及对操作符的运算性质了如指掌。

很多试题涉及到Java位运算符,今后都会以例题的形式展示给大家,然后慢慢的分析其中原理。

不该被忽视的CoreJava细节(三)的更多相关文章

  1. 不该被忽视的CoreJava细节(一)

    一.系列文章导言 <不该被忽视的CoreJava细节>系列文章将会持续更新.我希望自己通过这一系列文章的写作,能与读者一起进步,逐步完善对Java体系结构的了解. 二.本期关注点 几乎翻看 ...

  2. 不该被忽视的CoreJava细节(四)

    令人纳闷的数组初始化细节 这个细节问题我很久以前就想深入研究一下,但是一直没有能够抽出时间,借这系列文章的东风,尽量解决掉这个"心头病". 下面以一维int数组为例,对数组初始化方 ...

  3. ASP.NET常被忽视的一些细节

    原文:ASP.NET常被忽视的一些细节 前段时间碰到一个问题:为什么在ASP.NET程序中定时器有时候会不工作? 这个问题看起来很奇怪,代码好像也没错,但就是结果与预期不一致. 其实这里是ASP.NE ...

  4. mysql.user细节三问

    一.如何拒绝用户从某个精确ip访问数据库假如在mysql.user表中存在用户'mydba'@'192.168.85.%',现在想拒绝此用户从某个精确ip访问数据库 # 创建精确ip用户,分配不同的密 ...

  5. C语言里面关于数组的一个容易忽视的小细节

    ginobili@VM_44_28_sles10sp1:~/code> cat test3.cpp #include <stdio.h> int main(){ char a[5] ...

  6. 谈谈一些有趣的CSS题目(三)-- 层叠顺序与堆栈上下文知多少

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  7. 【原创】构建高性能ASP.NET站点之三 细节决定成败

    原文:[原创]构建高性能ASP.NET站点之三 细节决定成败 构建高性能ASP.NET站点之三 细节决定成败 前言:曾经就因为一个小小的疏忽,从而导致了服务器崩溃了,后来才发现:原来就是因为一个循环而 ...

  8. java三种工厂模式

    适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...

  9. 20155334 2016-2017-2 《Java程序设计》第三周学习总结

    20155334 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 第四章: 讲的是类类型,使用java撰写程序几乎都在使用对象(Object),要产生对象必须 ...

随机推荐

  1. 31.TCP/IP 三次握手与四次挥手

    TCP/IP三次握手 TCP建立连接为什么是三次握手,而不是两次或四次? TCP,名为传输控制协议,是一种可靠的传输层协议,IP协议号为6. 顺便说一句,原则上任何数据传输都无法确保绝对可靠,三次握手 ...

  2. URAL 2018 The Debut Album (DP)

    题意:给出n长度的数列,其实1的连续个数不超过a,2的连续个数不超过b. 析:dp[i][j][k] 表示前 i 个数,以 j 结尾,并且连续了k个长度,要用滚动数组,要不然MLE. 代码如下: #p ...

  3. 除了BAT,计算机、软件专业的毕业生还有别的好去处吗?

    "学技术的同学应该关注36氪.pingwest,极客公园这些圈子里很有影响力的科技媒体" 转载--除了BAT,计算机.软件专业的毕业生还有别的好去处吗? 又到校招季,985理工科的 ...

  4. .net动态代理-EMIT,AOP实现

    动态代理实现原理: 通过动态基础目标类,重写目标虚方法,.net中实现手段-il Emit.Proxy项目源码,https://github.com/1448376744/Emit.Proxy 以下是 ...

  5. wpf listboxitem添加下划线

    1.通过List<string>进行赋值,没有字段绑定 // 前台xaml <ListBox x:Name="list1"> <ListBox.Ite ...

  6. bat实现监测计算机网络连接,断网自动重启网络连接

    十月一体验了windows 10预览版之后,决定继续装回正式版,尝个鲜就好了,毕竟预览版还是不稳定,环境不是很方便. 决定装个最新正式版windows 8.1,结果问题来了,无线连接总是失败,显示网络 ...

  7. 51nod1010(枚举+二分)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010 题意:中文题诶- 思路:求第一个比 x (1<= ...

  8. 洛谷P3966 [TJOI2013]单词(后缀自动机)

    传送门 统计单词出现次数……为啥大家都是写AC自动机的嘞……明明后缀自动机也能做的说…… 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...

  9. Java Web之分页的实现(通用)

    一.用到的工具类的封装 为了实现代码的重用性,我们将经常用到的代码封装到工具类中,以便在任何地方都可以调用 1.获取路径工具 在jsp页面中,我们经常会向Servlet发送请求,并通过反射,实现通过传 ...

  10. 打造H5动感影集的爱恨情仇–动画性能篇

    “你听说过动感影集么?” 动感影集是QQ空间新功能,可以将静态的图片轻松转变为动态的视频集,且载体是HTML5(简称H5)页面,意味着可以随时分享到空间或朋友圈给好友欣赏! 移动端区别于PC年代的相册 ...