Java基础东西(按位操作运算)

http://aokunsang.iteye.com/blog/615658

前奏:

   昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊,是吧?但是那哥们的回答,让我郁闷半天:“这都不会啊,都是Java基础的东西呀!”我靠,我晕倒,听着老不爽了,so我决定对位移一探究竟,原来也这么随意啊,哈哈。因此,把心得总结如下,欢迎收看。

在这里先感谢一下,JavaEye上的高手们的技术博客指点。TKS very much。

技术总结:

<1>.在了解位移之前,先了解一下正数和负数的二进制表示形式以及关系:
举例15和-15:

15的原码: 00000000 00000000 00000000 00001111
    补码: 11111111 11111111 11111111 11110000
                 +1 =
-15的原码:11111111 11111111 11111111 11110001

负数的原码即为:正数的原码取反,再加1。

<2>位移操作:(只针对int类型的数据有效,java中,一个int的长度始终是32位,也就是4个字节,它操作的都是该整数的二进制数).也可以作用于以下类型,即byte,short,char,long(当然,它们都是整数形式)。当为这四种类型是,JVM先把它们转换成int型再进行操作。

<<     左移  
>>     右移
>>>    无符号右移

<<和>>为数值位移,>>>为逻辑位移。【注】:Java中不存在<<<。

$1> m<<n的含义:把整数m表示的二进制数左移n位,高位移出n位都舍弃,低位补0.  (此时将会出现正数变成负数的形式)
实例:
  3<<2剖析:
  3二进制形式: 00000000 00000000 00000000 00000011,按照$1的原理,得到00000000 00000000 00000000 00001100,即为12.
 
  左移使整数变为负数:
  10737418<<8
  10737418二进制表示形式:00000000 10100011 11010111 00001010,按照$1的原理,得到10100011 11010111 00001010 00000000,即为:-1546188288.

$2> m>>n的含义:把整数m表示的二进制数右移n位,m为正数,高位全部补0;m为负数,高位全部补1.
实例:
  3>>2剖析:
  3二进制形式: 00000000 00000000 00000000 00000011,按照$2的原理,得到00000000 00000000 00000000 00000000,即为0.
  -3>>2剖析:
  -3二进制形式: 11111111 11111111 11111111 11111101,按照$2的原理,得到11111111 11111111 11111111 11111111,即为-1.

以上:每个整数表示的二进制都是32位的,如果右移32位和右移0位的效果是一样的。依次类推,右移32的倍数位都一样。

$3> m>>>n:整数m表示的二进制右移n位,不论正负数,高位都补零。
实例:
  3>>>2剖析:
  3二进制形式: 00000000 00000000 00000000 00000011,按照$3的原理,得到00000000 00000000 00000000 00000000,即为0.
  -3>>>2剖析:
  -3二进制形式: 11111111 11111111 11111111 11111101,按照$3的原理,得到00111111 11111111 11111111 11111111,即为1073741823.

【注】:对于$1,$2,$3,如果n为负数:这时JVM会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到 n 变成一个正数。
实例:
   4<<-10
   4的二进制形式:00000000 00000000 00000000 00000100,-10对32取模再加上32,不用说了,得到22,则4<<-10,即相当于4<<22。
   此时按照再按照$1原理,得到00000001 00000000 00000000 00000000,得到的即为:16777216。

OK,大功告成。

综上所述:
   m<<n即在数字没有溢出的前提下,对于正数和负数,左移n位都相当于m乘以2的n次方.
   m>>n即相当于m除以2的n次方,得到的为整数时,即为结果。如果结果为小数,此时会出现两种情况:(1)如果m为正数,得到的商会无条件的舍弃小数位;(2)如果m为负数,舍弃小数部分,然后把整数部分加+1得到位移后的值。

---------------------------------------------------------------------------------

接下来在此说说位操作的好处,速度超快,这些都是底层的二进制机器操作指令。
  比如:a*2,

1.jvm先为变量a分配空间;

2.再进行a*2的操作;

3.再把结果返回给相应的变量。
而a<<1,和a*2一样,它只需要一条指令即可,速度很快。当然前三种位移操作都是对2的倍数

进行操作时可用。

再进行些许补充,谈到位操作,当然还要说到四个操作符:~(按位非),|(按位或),&(按位

与),^(按位异或),这些都是大学计算机基础用法,对整数的二进制形式进行操作,然后再

转换为整数,具体操作如下。
1.~(按位非):【解义】对该整数的二进制形式逐位取反。
    ~4:(一元操作符)
     4的二进制形式为:00000000 00000000 00000000 00000100,逐位取反后得

到:11111111 11111111 11111111 11111011,即为-5.
2.|(按位或):【解义】对两个整数的二进制形式逐位进行逻辑或运算,原理为:1|0=1,0|0=0,1|1=1,0|1=1
等。
    4|-5:
     4的二进制形式为:00000000 00000000 00000000 00000100,
    -5的二进制形式为:11111111 11111111 11111111 11111011,
  逐位进行逻辑或运算:11111111 11111111 11111111 11111111,即得到-1.
3.&(按位与):【解义】对两个整数的二进制形式逐位进行逻辑与运算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。 
   4&-5:
     4的二进制形式为:00000000 00000000 00000000 00000100,
    -5的二进制形式为:11111111 11111111 11111111 11111011,
  逐位进行逻辑与运算:00000000 00000000 00000000 00000000,即得到0.

实际应用:可以把字节转换为整数,-64&0xFF=192,也可以用八进制的形式,-64&0377=192、

其实0xFF和0377都表示的是整数255、
4.^(按位异或):【解义】对两个整数的二进制形式逐位进行逻辑异或运算,原理:1^1=0,1^0=1,0^1=1,0^0=0.
   4^-5:
     4的二进制形式为:00000000 00000000 00000000 00000100,
    -5的二进制形式为:11111111 11111111 11111111 11111011,
逐位进行逻辑异或运算:11111111 11111111 11111111 11111111,即得到-1.

实际应用:按位异或可以比较两个数字是否相等,它利用1^1=0,0^0=0的原理。  20^20==0

时间: 2024-11-08 21:03:44

Java基础东西(按位操作运算)的相关文章

黑马程序员——java基础--运算符、位操作

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- <pre name="code" class="java">public class test{ public static void main(String args[]){ byte b = 3; b = b + 2; System.out.println(b); } } 这段代码输出结果是错的,因为byte占一个字节,没有定义的整数2占4位,b+

Java基础_自加运算

int a = 4, b = a++; System.out.println("a=" + a); System.out.println("b=" + b);结果为 a=5,b=4 int a = 4, b = ++a; System.out.println("a=" + a); System.out.println("b=" + b);结果为 a=5,b=5 * a:单独使用: 放在操作数的前面和后面效果一样.(这种用法是我

Java基础--基本类型与运算

八个基本类型: boolean/1 byte/8     -2^7~2^7-1 char/16    0~2^16-1 short/16   -2^15~2^15-1 int/32      -2^31~2^31-1 float/32 long/64    -2^63~2^63-1 double/64 每个基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成. Integer x = 2; // 装箱 int-->Integer int y = x; // 拆箱

Java 基础 之 三目运算

http://www.verejava.com/?id=16992606159717 public class Operation6 { public static void main(String[] args) { //三目运算 int score=90; String result=score>=60?"及格":"不及格"; System.out.println(result); } } /* 回顾总结 运算分为: 1.算数运算 包括 +,-,*,/,%

java基础学习-变量&运算

package com.J; public class java { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub float a=1.11111111111111f;    // 数据表示单精度末尾+"f",此处数据存储要溢出 double b=1.1111111111111111;  // java里面默认小数都为double双精度浮点

Java基础-一文搞懂位运算

在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+.-.*./.%).关系运算(<.>.<=.>=.==.!=)和逻辑运算(&&.||.!),所以相对来说对位运算不是那么熟悉,本文将以Java的位运算来详细介绍下位运算及其应用. 1. 位运算起源 位运算起源于C语言的低级操作,Java的设计初衷是嵌入到电视机顶盒内,所以这种低级操作方式被保留下来.所谓的低级操作,是因为位运算的操作对象是二进制位,但是这种低级操作对计算机而言是非常简单直接,友好高效

Java基础学习第五天——方法与数组

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.02.24 lutianfei none 第三章Java基础语法 方法 方法就是完成特定功能的代码块,即函数. 格式: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2-) { 函数体; return 返回值; } 详细解释: 修饰符,目前就用public static,后详解. 返回值类型:就是功能结果的数据类型. 方法名:符合命名规则即可,方便我们的调用. 参数: 实际参数:就是实际参与运算的.

java基础--JDK安装、环境变量配置、工具开发第一个程序、数据类型、运算符

**-----Java基础大纲-----**   **-----本章节-----** 1.Java语言的历史.特点及工作原理 2.JRE和JDK的介绍 3.Java运行环境和开发工具 4.Java基础语法 **-----下一章节-----** 5.条件语句 6.循环 7.数组 ============================================== 一:历史及开发准备 1.Java发展历程及来源 (1)发展历程 1996年1月,Sun公司发布了Java的第一个开发工具包(JD

java 基础(二)

java 基础(二)java 基础(二) 2016-2-1 by Damon 61. 编写多线程程序有几种实现方式 Java 5以前实现多线程有两种实现方法:一种是继承Thread类:另一种是实现Runnable接口.两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活. 补充:Java 5以后创建线程还有第三种方式:实现Callable接口,该接口中的