Java中的位运算符
Java提供的位运算符有:左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符。
PS:所有的位运算操作都是基于二进制补码进行的,干开发的都应该知道相关知识吧,我就不多哔哔。
在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,规定实际移动的次数是移动次数和32的余数,也就是移位33次和移位1次得到的结果相同。移动long型的数值时,规定实际移动的次数是移动次数和64的余数,也就是移动66次和移动2次得到的结果相同。
<<(左移)
按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
语法格式 需要移位的数字 << 移位的次数
例如:
System.out.println("'<<'位操作符(10 << 3):" + (10 << 3));
----------
输出结果
80
首先把10转换为二进制数字0000 0000 0000 0000 0000 0000 0000 1010,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0010 1000,则转换为十进制是80.
数学意义
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。 即:10*2^3=80
>>(右移)
按二进制形式把所有的数字向右移动对应val位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1.
语法格式 需要移位的数字 >> 移位的次数
例如
System.out.println("'>>'位操作符(10 >> 3):" + (10 >> 3));
System.out.println("'>>'位操作符(-10 >> 3):" + (-10 >> 3));
---------- 输出结果
'>>'位操作符(10 >> 3):1
'>>'位操作符(-10 >> 3):-2
10的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1010,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0001.转换为十进制是1.即:10/2^3 取整 1
数学意义 右移一位相当于除2,右移n位相当于除以2的n次方。
>>>(无符号右移)
按二进制形式把所有的数字向右移动对应val位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。
System.out.println("'>>>'位操作符(-10 >>> 3):" + (-10 >>> 3));
System.out.println("'>>>'位操作符(10 >>> 3):" + (10 >>> 3));
------------ 输出结果: '>>>'位操作符(-10 >>> 3):536870910
'>>>'位操作符(10 >>> 3):1
对-10右移三位的过程为:舍弃二进制数的最后三位,在二进制数的开头增加三个0,导致原来的符号位由‘1’变成了‘0’,由负数变成了正数;
-10的二进制原码: 1000 0000 0000 0000 0000 0000 0000 1010,
反码:1111 1111 1111 1111 1111 1111 1111 0101
补码:1111 1111 1111 1111 1111 1111 1111 0110
补码右移三位后 0001 1111 1111 1111 1111 1111 1111 1110,转换成十进制 536870910
& (与运算符)
与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值都是 1,则结果值相应的 bit 就是 1,否则为 0.
0 & 0 = 0, 0 & 1 = 0, 1 & 1 = 1
System.out.println("'&'位操作符(10 & 3):" + (10 & 3));
---------
输出结果:
'&'位操作符(10 & 3):2
|(或运算符)
与运算时,进行运算的两个数,从最低位到最高位,一一对应。如果某 bit 的两个数值对应的值只要 1 个为 1,则结果值相应的 bit 就是 1,否则为 0。
0 | 0 = 0,
0 | 1 = 1,
1 | 1 = 1
System.out.println("'|'位操作符(10 | 3):" + (10 | 3));
----------
输出结果:
'|'位操作符(10 | 3):11
~ (取反运算符)
对操作数的每一位进行操作,1 变成 0,0 变成 1。
System.out.println("'~'位操作符(~ 10):" + (~10));
System.out.println("'~'位操作符(~ -10):" + (~-10));
----------
输出结果:
'~'位操作符(~ 10):-11
'~'位操作符(~ -10):9
10的二进制原码 0000 0000 0000 0000 0000 0000 0000 1010 反码,补码 同
~取反操作后:1111 1111 1111 1111 1111 1111 1111 1111 0101 补码
反码: 1111 1111 1111 1111 1111 1111 1111 1111 0100
原码:1000 0000 0000 0000 0000 0000 0000 1011 即 -11
个人猜想:N进行取反操作的结果是不是 -N-1????
^ (异或运算符)
两个操作数进行异或时,对于同一位上,如果数值相同则为 0,数值不同则为 1。
System.out.println("'^'位操作符(10^3):"+(10^3));
System.out.println("'^'位操作符(9^3):"+(9^3));
System.out.println("'^'位操作符(9^10):"+(9^10));
-------------
输出结果:
'^'位操作符(10^3):9
'^'位操作符(9^3):10
'^'位操作符(9^10):3
相信从这个例子,你们也应该看明白异或操作的规律了吧。
小结
二进制运算符,包括位运算符和移位运算符,使程序员可以在二进制基础上操作数字,可以更有效的进行运算,并且可以以二进制的形式存储和转换数据,是实现网络协议解析以及加密等算法的基础。
Java中的位运算符的更多相关文章
- Java中的位运算符、移位运算
一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&) :两位全为1,结果为1,否则为0: (2)按位或 (|) :两位有一个为1,结果为1,否则为0: (3) ...
- Java中的位运算符 &、|、^、~、<< 和 >>
一.& 按位与运算符 5 & 3 = 1 5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101 3转换为二进制:0000 0000 0000 ...
- Java 逻辑运算符、位运算符、移位操作符 总结(Java 学习中的小记录)
Java 逻辑运算符.位运算符.移位操作符 总结 作者:王可利(Star·星星) 逻辑运算符,表格如下: 解析逻辑运算符表: 1.与 (&) 特点:两个都为真的时候,结果为真.两个为 ...
- java中的移位运算符:<<,>>,>>>总结
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- Java中的移位运算符
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- java中的移位运算符:<<,>>,>>>总结(转)
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- 【java编程】java中的移位运算符
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- Java学习路线:Java中的位移运算符介绍
学习java本来就是一件日积月累的事情,或许你通过自学能掌握一些皮毛技术,学到java的一些基本大面,但想要做到精通,还是需要自己技术的日积月累和工作经验的不断积累. 今天给大家分享的技术知识是:ja ...
- [java基础] 002 - 位运算符的详解和妙用
一:位运算符详解 位运算符主要用来对操作数二进制的位进行运算.按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值. Java 语言中的位运算符分为位逻辑运算符和位移运算符两类, ...
随机推荐
- poj2728 生成树01分数规划 (二分答案)
给定整数序列a,b,求出下式的最大值 sum{ai*xi}/sum{bi*xi},xi=0|1 通俗来说,就是选出一些整数对(ai,bi),使得选出的a之和与选出的b之和商最大化 二分答案L,即选出的 ...
- C++ Primer 笔记——标准库类型string
1.如果使用等号初始化一个变量,实际上执行的是拷贝初始化,编译器吧等号右侧的初始值拷贝到新创建的对象中去:如果不使用等号则执行的是直接初始化. std::string str = "Test ...
- hexo+github page +markdown问题汇总
1.没有权限提交 解决办法:把git版本由2.x改为1.9 未完待续
- zabbix 3.2.4 使用详解
一:zabbix简介及原理 二:zabbix添加主机: /usr/share/zabbix/include/locales.inc.php #这里为zabbix语言包路径‘zh_CN’ 为true ...
- Choosing web framework: ASP.NET MVC vs Django Python vs Ruby on Rails(转载)
来源:http://podlipensky.com/2012/06/choosing-web-framework-asp-net-mvc-vs-django-python-vs-ruby-on-rai ...
- Spark的Streaming + Flume进行数据采集(flume主动推送或者Spark Stream主动拉取)
1.针对国外的开源技术,还是学会看国外的英文说明来的直接,迅速,这里简单贴一下如何看: 2.进入到flume的conf目录,创建一个flume-spark-push.sh的文件: [hadoop@sl ...
- CSS常见Bugs及解决方案列表
以下实例默认运行环境都为Standard mode 如何在IE6及更早浏览器中定义小高度的容器? 方法: #test{overflow:hidden;height:1px;font-size:0;li ...
- [转] 合理使用npm version与npm dist-tag详解
第一步:发布第一个稳定版本 npm publish//1.0.0 第二步:修改文件继续发布第二个版本 git add -A && git commit -m "c" ...
- [转]Java Web笔记:搭建环境和项目配置(MyEclipse 2014 + Maven + Tomcat)
来源:http://www.jianshu.com/p/56caa738506a 0. 绪言 Java Web开发中,除了基础知识外,开发环境搭建,也是一项基本功.开发环境包括了IDE.项目管理.项目 ...
- asp.net MVC5为WebAPI添加命名空间的支持
前言 默认情况下,微软提供的MVC框架模板中,WebAPI路由是不支持Namespace参数的.这导致一些比较大型的项目,无法把WebApi分离到单独的类库中. 本文将提供解决该问题的方案. 微软官方 ...