【Java基础】Java位运算

/*
 * JAVA位运算: 与(&)、非(~)、或(|)、异或(^)、左移(<<)、右移(>>)
 *+-----------------------------------------------------------------------------------+
 *|  &   |  当两边操作数的位同时为1时,结果为1,否则为0 如1 1 0 0 & 1 0 1 0 = 1 0 0 0       |
 *+-----------------------------------------------------------------------------------+
 *|  |   |  当两边操作数的位有一边为1时,结果为1,否则为0 如1 1 0 0 | 1 0 1 0 = 1 1 1 0     |
 *+-----------------------------------------------------------------------------------+
 *|  ~   |  将操作数的位0变1,1变0。如 ~1 1 0 0 = 0 0 1 1                                |
 *+-----------------------------------------------------------------------------------+
 *|  ^   |  当两边操作数的位相同时,结果为0,否者为1。如1 1 0 0 ^ 1 0 1 0 = 0 1 1 0         |
 *+-----------------------------------------------------------------------------------+
 *|  <<  |  将操作数按位左移m位,如 int 1 << 2, 0000 0000 0000 0000 0000 0000 0000 0001  |
 *|      |  << 2 = 0000 0000 0000 0000 0000 0000 0000 0100 = 4                        |
 *+-----------------------------------------------------------------------------------+
 *|  >>  |  将操作数按位右移m位,如 int 4 >> 2, 0000 0000 0000 0000 0000 0000 0000 0100  |
 *|      |  >> 2 = 0000 0000 0000 0000 0000 0000 0000 0001 = 1                        |
 *+-----------------------------------------------------------------------------------+
 *|  >>> |  无符号右移操作不考虑符号位,最右边数据位丢失,最左边数据位用0填充                  |
 *|      |  1111 1111 1111 1111 1111 1111 1111 0110 (-10) >>> 1 =                     |
 *|      |  0111 1111 1111 1111 1111 1111 1111 1011 (2147483643)                      |
 *+-----------------------------------------------------------------------------------+
 *==========================================================================================================
 *<< 运算规则:
 *1.按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零;
 *2.当左移的运算数是int类型时,每移动1位它的第31位就要被移出并且丢弃;
 *3.当左移的运算数是long类型时,每移动1位它的第63位就要被移出并且丢弃;
 *4.当左移的运算数是byte和short类型时,将自动把这些类型扩大为 int型;
 *
 *<< 数学意义:
 *1.数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方
 *
 *<< 注意事项:
 *1.如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位
 *2.n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1) -- 2^(n-1) -1,所以模为2^(n-1)
 *===========================================================================================================
 *>> 运算规则:
 *1.按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1
 *2.当右移的运算数是byte 和short类型时,将自动把这些类型扩大为 int 型
 *例如:如果要移位值为负数,每一次右移都在左边补1,如果要移位值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位),在进行右移
 *
 *>> 数学意义
 *1.右移一位相当于除2,右移n位相当于除以2的n次方
 *
 *>> 注意事项:
 *1.符号位不变,左边补上符号位
 *===========================================================================================================
 *>>>
 *1.忽略了符号位扩展,0补最高位
 *2.无符号右移运算符>>> 只是对32位和64位的值有意义
 *===========================================================================================================
 *负数以其正值的补码形式表示
 *补码 = 原码的反码 + 1
 *反码 = 原码按位取反
 *原码 = 数字的二进制表示
 *
 *在密码运算和图形操作中,位移操作才会被经常用到。只有在需要特别快的性能,并且性能测试证明数学
 *运算导致了性能问题的情况下,才使用位移操作。
 *===========================================================================================================
 *    1 <<  2  = 0000 0000 0000 0000 0000 0000 0000 0001 << 2  = 0000 0000 0000 0000 0000 0000 0000 0100   [4]
 *    1 <<  -2 = 0000 0000 0000 0000 0000 0000 0000 0001 << -2 = 0000 0000 0000 0000 0000 0000 0000 0100   [1073741824] == [1 << 32 + (-2)]
 *    1 <<  31 = 0000 0000 0000 0000 0000 0000 0000 0001 << 31 = 1000 0000 0000 0000 0000 0000 0000 0000   [-2147483648] == [-2^31]
 *   -1 <<  2  = 1111 1111 1111 1111 1111 1111 1111 1111 << 2  = 1111 1111 1111 1111 1111 1111 1111 1100   [-4]
 *-2^31 <<  2  = 1000 0000 0000 0000 0000 0000 0000 0000 << 2  = 0000 0000 0000 0000 0000 0000 0000 0000   [0]
 *-2^31 >>  2  = 1000 0000 0000 0000 0000 0000 0000 0000 << 2  = 1110 0000 0000 0000 0000 0000 0000 0000   [-536870912]
 *-2^31 >>> 2  = 1000 0000 0000 0000 0000 0000 0000 0000 << 2  = 0010 0000 0000 0000 0000 0000 0000 0000   [536870912]
 *===========================================================================================================
*/
时间: 2024-07-30 05:13:39

【Java基础】Java位运算的相关文章

Java 基础 之 位运算

http://www.verejava.com/?id=16992602784016 public class Operation5 { public static void main(String[] args) { //位运算 /* 包括: 与 &, 或 |, 取反 ~, 异或 ^ 带符号左移<<, 带符号右移 >>, 无符号右移 >>> 1. & 就是二进制位如果都是1则为1,否则为0 2. | 就是二进制位如果都是0则为0,否则为1 3.

java中的位运算

刚才在imooc看php基础发现一个特别容易让我们理解的描述[关于异或运算的] 之前学习java的时候 位运算有4种,当时是这样记录的: &  按位与 (and) 两个对应二进制都为1则为1,其余全为0 |   按位或(or) 两个二进制数有一个为1则为1,只有两个0才为0 ~  按位非(NOT) 二进制中取反 ^  按位异或(XOR) 两个二进制中相同为则为0,不同则为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 float保留两位小数或多位小数

方法1:用Math.round计算,这里返回的数字格式的. float price=89.89; int itemNum=3; float totalPrice=price*itemNum; float num=(float)(Math.round(totalPrice*100)/100);//如果要求精确4位就*10000然后/10000 方法2:用DecimalFormat 返回的是String格式的.该类对十进制进行全面的封装.像%号,千分位,小数精度.科学计算. float price=

[Java基础] Java对象内存结构

转载地址:http://www.importnew.com/1305.html 原文于2008年11月13日 发表, 2008年12月18日更新:这里还有一篇关于Java的Sizeof运算符的实用库的文章. 学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制.而在C++中就可以通过sizeof运算符来获得基本类型以及类实例的大小.C和C++中的这个操作符对于指针运算.内存拷贝和IO操作都非常有用. Java中并没有一个类似的运算符.事实上,Java也不需要这种运

Java基础--Java入门

IsCoder 标记: Java基础,Java环境配置 一.Java环境配置 Java Develop Kit(JDK安装) 系统环境变量设置(JAVA_HOME) Java源程序编辑工具 Java编译运行命令 运行经典的HelloWorld程序 1.1 JDK安装 JDK,就是甲骨文公司提供给我们的Java开发工具包,包括最常用的Javac.exe编译工具和Java.exe运行工具.需要指出的是,JDK中已经包含了JER(Java Runtime Environment,Java运行时环境),

程序猿二三事之Java基础--Java SE 5增加的特性--语法篇(一)

程序猿二三事之Java基础–Java SE 5增加的特性–语法篇(一) [ TOC ] 为什么是Java SE 5? 目前已经到了JDK-8u74了,JDK7的主版本已经于2015年4月停止公开更新. 那为什么还要来说Java/JDK5呢? Java SE在1.4(2002)趋于成熟,随着越来越多应用于开发企业应用,许多框架诞生于这个时期或走向成熟. Java SE 5.0的发布(2004)在语法层面增加了很多特性,让开发更高效,代码更整洁. 自动装箱/拆箱.泛型.注解.for循环增强.枚举.可

java基础----&gt;java中正则表达式二

跟正则表达式相关的类有:Pattern.Matcher和String.今天我们就开始Java中正则表达式的学习. Pattern和Matcher的理解 一.正则表达式的使用方法 一般推荐使用的方式如下: Pattern pattern = Pattern.compile("^[^abc]h$"); Matcher matcher = pattern.matcher("hh"); boolean isMatch = matcher.matches(); 另外一种不能复

[Java基础] Java线程复习笔记

先说说线程和进程,现代操作系统几乎无一例外地采用进程的概念,进程之间基本上可以认为是相互独立的,共享的资源非常少.线程可以认为是轻量级的进 程,充分地利用线程可以使得同一个进程中执行多种任务.Java是第一个在语言层面就支持线程操作的主流编程语言.和进程类似,线程也是各自独立的,有自 己的栈,自己的局部变量,自己的程序执行并行路径,但线程的独立性又没有进程那么强,它们共享内存,文件资源,以及其他进程层面的状态等.同一个进程内的 多个线程共享同样的内存空间,这也就意味着这些线程可以访问同样的变量和

Java基础--Java编程规范

IsCoder 标记: Java基础,Java编程规范 摘要:Java虽然没有强制性的编程规范,但是为了便于统一,Java有不成文的编程规范,为了形成良好的编程习惯,建议熟悉并遵守Java编程规范,提高代码的阅读性. 一.Java标识符 在任何语言中,都要自己的一套标识符规则.Java的标识符包括:Java关键字.Java特殊功能的标识符.合法的用户自定义标识符.其中,我们能改变的只有自定义的标识符,和大部分计算机编程语言一样,Java标识符原始只支持ASCII的编码,但是随着Java在世界的影