think in java 读书笔记 1 ——移位

在Think in Java中有这么一段话“对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会有用。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。”

对上面那段话的理解是:移位操作符操作的运算对象是二进制的“位”,int类型是32位也就是2的5次幂 !如果移32位以上,那么原来的数的信息会全部丢失,这样也就没有什么意义了!所以上面的“只有右侧的5个低位才会有用”说的是:移位操作符右端的那个数(化成二进制)的低5位才有用,即 
X < <y; 
是指y的低5位才有用,即不能大于32。 而对于long型也是同样的道理!

 1 package com.xingle_test.operator;
 2
 3 /**
 4  *
 5  * @ClassName: shifting 移位操作
 6  * @author Xingle
 7  * @date 2014-7-22 上午9:30:16
 8  */
 9 public class shifting {
10
11     public static void main(String[] args) {
12         int i = 1;
13         pBinInt("" + i + "", i);
14         int i_1 = i << 2;
15         pBinInt("<<2", i_1);
16         int i_2 = i << 34;
17         pBinInt("<<34", i_2);
18         System.out.println();
19
20         int k = -1;
21         pBinInt("" + k + "", k);
22         int k_1 = k << 2;
23         pBinInt("<<2", k_1);
24         int k_2 = k << 34;
25         pBinInt("<<34", k_2);
26         System.out.println();
27
28         long j = -12;
29         pBinLong("" + j + "", j);
30         long j_1 = j >> 2;
31         pBinLong(">>2", j_1);
32         long j_2 = j >> 66;
33         pBinLong(">>66", j_2);
34         System.out.println();
35
36     }
37
38     /**
39      * long 打印二进制
40      *
41      * @param s
42      * @param j
43      * @author xingle
44      * @data 2014-7-22 上午9:41:17
45      */
46     private static void pBinLong(String s, long l) {
47         System.out.println(s + ", long: " + l + ", binary: ");
48         System.out.print(" ");
49         for (int i = 63; i >= 0; i--)
50             if (((1L << i) & l) != 0)
51                 System.out.print("1");
52             else
53                 System.out.print("0");
54         System.out.println();
55     }
56
57     /**
58      * int 打印二进制
59      *
60      * @param s
61      * @param i
62      * @author xingle
63      * @data 2014-7-22 上午9:31:42
64      */
65     private static void pBinInt(String s, int i) {
66         System.out.println(s + ", int: " + i + ", binary: ");
67         System.out.print(" ");
68         for (int j = 31; j >= 0; j--)
69             if (((1 << j) & i) != 0)
70                 System.out.print("1");
71             else
72                 System.out.print("0");
73         System.out.println();
74     }
75
76 }

执行结果:

1, int: 1, binary:
00000000000000000000000000000001
<<2, int: 4, binary:
00000000000000000000000000000100
<<34, int: 4, binary:
00000000000000000000000000000100

-1, int: -1, binary:
11111111111111111111111111111111
<<2, int: -4, binary:
11111111111111111111111111111100
<<34, int: -4, binary:
11111111111111111111111111111100

-12, long: -12, binary:
1111111111111111111111111111111111111111111111111111111111110100
>>2, long: -3, binary:
1111111111111111111111111111111111111111111111111111111111111101
>>66, long: -3, binary:
1111111111111111111111111111111111111111111111111111111111111101

从以上结可以看到对于32位的int型,左移2位和左移34位的结果是相同的;

对于long型,左移2位和左移66位的结果是一样的。

在java中无论左移右移,会遵循下面的规则

value<<n(其中value为int,n>=0) 等价于 value<<(n%32)
value>>n (其中value为int,n>=0) 等价于 value>>(n%32)
value>>>n (其中value为int,n>=0) 等价于 value>>>(n%32)
对于long类型的:
value<<n(其中value为long,n>=0) 等价于 value<<(n%64)
value>>n (其中value为long,n>=0) 等价于 value>>(n%64)
value>>>n (其中value为long,n>=0) 等价于 value>>>(n%64)

 1 /**
 2  * @Title: shifting.java
 3  * @Description: TODO
 4  * @author :Xingle
 5  * @date 2014-7-22 上午9:30:16
 6  * @version
 7  */
 8
 9 package com.xingle_test.operator;
10
11 /**
12  *
13  * @ClassName: shifting 移位操作
14  * @author Xingle
15  * @date 2014-7-22 上午9:30:16
16  */
17 public class shifting {
18
19     public static void main(String[] args) {
20
21         int i = 100;
22         pBinInt("" + i + "", i);
23         int i_1 = i << -38;
24         pBinInt("<<-38", i_1);
25         int i_2 = i << 26;
26         pBinInt("<<26", i_2);
27         System.out.println();
28
29         int k = -100;
30         pBinInt("" + k + "", k);
31         int k_1 = k << -38;
32         pBinInt("<<-38", k_1);
33         int k_2 = k << 26;
34         pBinInt("<<26", k_2);
35         System.out.println();
36
37         long j = 12;
38         pBinLong("" + j + "", j);
39         long j_1 = j << -3;
40         pBinLong("<<-3", j_1);
41         long j_2 = j << 61;
42         pBinLong("<<61", j_2);
43         System.out.println();
44
45         long a = -112;
46         pBinLong("" + a + "", a);
47         long a_1 = a >>> -67;
48         pBinLong(">>> -67", a_1);
49         long a_2 = a >>> 61;
50         pBinLong(">>> 61", a_2);
51         System.out.println();
52
53     }
54
55     /**
56      * long 打印二进制
57      *
58      * @param s
59      * @param j
60      * @author xingle
61      * @data 2014-7-22 上午9:41:17
62      */
63     private static void pBinLong(String s, long l) {
64         System.out.println(s + ", long: " + l + ", binary: ");
65         System.out.print(" ");
66         for (int i = 63; i >= 0; i--)
67             if (((1L << i) & l) != 0)
68                 System.out.print("1");
69             else
70                 System.out.print("0");
71         System.out.println();
72     }
73
74     /**
75      * int 打印二进制
76      *
77      * @param s
78      * @param i
79      * @author xingle
80      * @data 2014-7-22 上午9:31:42
81      */
82     private static void pBinInt(String s, int i) {
83         System.out.println(s + ", int: " + i + ", binary: ");
84         System.out.print(" ");
85         for (int j = 31; j >= 0; j--)
86             if (((1 << j) & i) != 0)
87                 System.out.print("1");
88             else
89                 System.out.print("0");
90         System.out.println();
91     }
92
93 }

执行结果:

100, int: 100, binary:
00000000000000000000000001100100
<<-38, int: -1879048192, binary:
10010000000000000000000000000000
<<26, int: -1879048192, binary:
10010000000000000000000000000000

-100, int: -100, binary:
11111111111111111111111110011100
<<-38, int: 1879048192, binary:
01110000000000000000000000000000
<<26, int: 1879048192, binary:
01110000000000000000000000000000

12, long: 12, binary:
0000000000000000000000000000000000000000000000000000000000001100
<<-3, long: -9223372036854775808, binary:
1000000000000000000000000000000000000000000000000000000000000000
<<61, long: -9223372036854775808, binary:
1000000000000000000000000000000000000000000000000000000000000000

-112, long: -112, binary:
1111111111111111111111111111111111111111111111111111111110010000
>>> -67, long: 7, binary:
0000000000000000000000000000000000000000000000000000000000000111
>>> 61, long: 7, binary:
0000000000000000000000000000000000000000000000000000000000000111

由以上可以看出:

对于int,左移-38和左移26是相等的;

对于long,左移-3和左移61是相等的;

对于无符号右移,右移-67和右移61是相等的;

结论:

value << -n(value为int,n>=0) 等价于 value << (-n & 31)
value >> -n(value为int,n>=0) 等价于 value >> (-n & 31)
value >>> -n(value为int,n>=0) 等价于 value >>> (-n & 31)
而对于long
value << -n(value为long,n>=0) 等价于 value << (-n & 63)
value >> -n(value为long,n>=0) 等价于 value >> (-n & 63)
value >>> -n(value为long,n>=0) 等价于 value >>> (-n & 63)

think in java 读书笔记 1 ——移位

时间: 2025-01-17 04:13:35

think in java 读书笔记 1 ——移位的相关文章

think in java 读书笔记 3 —— 数据报

目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 概要 1. 数据报基本知识 1. 数据报基本知识 之前套接字中例子使用的都是“传输控制协议”(TCP),亦称作“基于数据流的套接字”.根据该协议的设计宗旨,它具有高度的可靠性,而且能保证数据顺利抵达目的地.换言之,它允许重传那些由于各种原因半路“走失”的数据.而且收到字节的顺序与它们发出来时是一样的.当然,这种控制与可靠性需要我们付出一些代价:TCP 具有非常高的开销. 还有另一种协

think in java 读书笔记

java中没有单独函数的概念,依赖类的方法. java中优化了向前引用,类可以在调用者之后. java中包的命名方法实际上是网址的倒转. c++中因为存在全局变量和函数所以会存在一个变量名冲突的问题,但是java中不存在全局变量,不同程序设计者通过不同的类将相同名字的变量和方法隔离. static关键字 通常,我们创建类时会指出那个类的对象的外观与行为.除非用new 创建那个类的一个对象,否则实际上并 未得到任何东西.只有执行了new 后,才会正式生成数据存储空间,并可使用相应的方法. 但在两种

Effective Java 读书笔记(2创建和销毁对象)

第一章是引言,所以这里不做笔记,总结一下书中第一章的主要内容是向我们解释了这本书所做的事情:指导Java程序员如何编写出清晰.正确.可用.健壮.灵活和可维护的程序. 2.1考虑用静态工厂方法代替构造器 静态工厂方法与构造器相比有四大优势: (1)静态工厂方法有名称,具有适当名称的静态工厂方法易于使用.易于阅读: (2)不必每次在调用它们的时候都创建一个新的对象: (3)可以返回原返回类型的任何子类型的对象: (4)在创建参数化类型实例的时候,它们使代码变得更加简洁. 同时静态工厂方法也有两大缺点

Effective Java读书笔记(4 类和接口)

4.1 使类和成员的可访问性最小化 要区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰的隔离开来,然后模块之间只通过API进行通信,一个模块不需要知道其他模块内部的工作情况,这个概念被称为信息隐藏或封装,是软件设计的基本原则之一. 4.2 在公有类中使用访问方法而非公有域 坚持面向对象程序设计思想:如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改

【java读书笔记】——java的异常处理

程序在实际环境的运行过程中,安全成为需要首先考虑的重要因素之一,这也是用户和程序员最关心的问题.同时,Java语言健壮性也体现在了能够及时有效地处理程序中的错误,准确的说是Java的异常处理机制为解决安全问题提交了一份满意的答卷. 先从整体上看一下本文要介绍的内容,然后进行详细的分析: 1.异常的概念 异常又称为例外,是特殊的运行错误对象,对应着Java语言特定的运行错误处理机制. 上面的概念是书本上说的,下面我谈一下自己的看法 其实异常处理机制提供了统一的机制来识别和响应程序错误,异常可以为我

Effective Java读书笔记(3对于所有对象都通用的方法)

3.1 覆盖equals时请遵守通用约定 什么时候应该覆盖Object.equals()方法呢? 如果类具有自己特有的"逻辑相等"概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. Object.equals()方法具有自反性.对称性.传递性.一致性和与null比较返回false的特点. 实现高质量equals方法的诀窍: (1)使用==操作符检查"参数是否为这个对象的引用".如果是,则返回true,这

【java读书笔记】——java开篇宏观把控 + HelloWorld

学完java有一段时间了,一直没有做相应的总结,总觉得有一种缺憾.从这篇博客开始,将自己平时的学习笔记进行总结归纳,分享给大家. 这篇博客主要简单的介绍一下java的基础知识,主要的目的是扫盲.原来只是听说过java,现在自己真正开始学习了,看完了第一集视频之后,问自己,你知道java是什么吗?问完之后才发现一无所知,上完查一查,简单了解一下,给自己扫盲. 介绍 知道java是一种可跨平台应用软件的面向对象的程序设计语言,就可以了. 组成 Java由四方面组成:java编程语言,java类文件格

【java读书笔记】JSTL,快速精通

JSTL并不是什么新颖的技术而且很简单,甚至有人认为JSTL已经过时了.但是我认为它既然存在,就有存在的道理,作为技术人员就应该知道它们是什么,怎么使用,有什么优点. JSTL包含两部分:标签库和EL语言.下面先介绍标签库,再介绍EL语言,最后总结一下JSTL的优点. JSTL JSTL简介 JSTL(JavaServer Page Standard Tag Library,即:JSP标准标签库),是由SUN公司提供的简化JSP页面设计的标签.JSTL是由Core(核心库).Format(格式化

java读书笔记二

这是我的一些读书笔记: 我研究了一下面向对象: 面向对象符合人类看待事物的一般规律,对象的方法的实现细节是包装的,只有对象方法的实现者了解细节 我觉得面向过程是由过程.步骤.函数组成,过程是核心,面向对象是以对象为中心,先有类,得到对象,通过对象之间相互通信实现功能,面向过程是先有算法,后有数据结构, 而面向对象是先有数据结构,然后再有算法. 然后就是一些重要的: main方法是静态的. Public static void main(String[] args) 源代码的文件名必须与公有类的名