Java位运算基础知识

在学习Java运算时,补充学习Java位运算。

Java位运算

位运算都是针对整数的补码进行位运算。

& 按位与运算

先将整数转换为补码 ,然后执行按位与运算,最后将结果返回为十进制,它有如下几个规律:

(1)正数&其他数=正数 考虑最高位为0,按位与都为0

(2)偶数&其他数=偶数 考虑最低位为0,按位与都为0

(3)0&其他数=0 按位与后位数全是0

(4)1&奇数=1,1&偶数=0 通过它可以快速判断一个数是奇数还是偶数

| 按位或运算

先将整数转换为补码 ,然后执行按位或运算,最后将结果返回为十进制,它有如下几个规律:

(1)负数|其他数=负数 考虑最高位为1,按位或都为1

(2)奇数|其他数=奇数 考虑最低位为1,按位或都为1

(3)0|其他数=原数 按位或后位数不变

^ 按位异或运算

先将整数转换为补码 ,然后执行按异位或运算,最后将结果返回为十进制,它有如下几个规律:

(1)偶数^偶数=偶数 考虑最低位为0,按位异或为0

(2)偶数^奇数=奇数 考虑最低位为1和0,按位异或为1

(3)奇数^奇数=偶数 考虑最低位为1,按位异或为0

(4)a^b^b或者b^a^b=a b^b=0,然后其他数异或一个0,就是原数

示例代码

 1 public class OperatorAndOrXor{
 2     public static void main(String[] args){
 3         //测试按位与运算
 4         int a=9;
 5         int b=11;
 6         System.out.println(a&b);//9
 7
 8         //测试按位或运算
 9         System.out.println(a|b);//11
10
11         //测试按位异或运算
12         System.out.println(a^b);//2
13         System.out.println(a^b^b);//9
14     }
15 }

测试结果

<< 左移

数据左移,先将其转换为补码,然后向左移动相应位次,移出的部分舍弃,低位空出补0,最后转换为十进制,左移动几位相当于乘以2的几次方,如byte类型1左移3位,就是从0000 0001→0000 1000,变成了8。

>> 右移

数据右移,先将其转换为补码,然后向右移动相应位次,移出的部分舍弃,高位空出有两种情况,如果是正数高位补0,负数则高位补1,最后转换为十进制,一定范围内,右移动几位相当于除以2的几次方,如byte类型8右移3位,就是从0000 1000→0000 0001,变成了1。

此外正数右移动,越移动0越多,如byte类型最后补码变成0000 0000,转换成原码也是0000 0000,最小变成0。

负数右移动,越移动1越多,如byte类型,最后补码变成1111 1111,转换成反码为1111 1110,再转换为原码变成1000 0001,最后结果变成-1。

>>> 无符号右移动

无符号右移,先将其转换为补码,然后向右移动相应位次,移出的部分舍弃,高位空出不论正负数一律补0,最后转换为十进制。可以看出正数的无符号右移动和右移没有区别,负数就有区别了,负数的无符号右移>>>运算会变成正数,且负数越大,补码中1越多,无符号右移后正数越大。

~ 按位取反

将数据转换为补码后,一律1变0,0变1,最后将结果转换为十进制,按位取反有互补对称公式-n=~n+1。

代码部分

 1 public class MoveMethod{
 2     public static void main(String[] args){
 3         //测试左移、右移、无符号右移、取反运算
 4         //左移
 5         int i=1;
 6         System.out.println(i<<3);//8
 7
 8         //右移
 9         int j=8;
10         System.out.println(j>>3);//1
11
12         //左移右移很大位数
13         System.out.println(i<<35);//8
14         System.out.println(j>>35);//1
15
16         //无符号右移
17         System.out.println(j>>>3);//1
18         int k=-1;
19         System.out.println(k>>>1);//负数变成正数
20
21         //取反 -n=~n+1
22         System.out.println(~j);//-9
23         System.out.println(~k);//0
24     }
25 }

测试结果

需要注意的是,移位运算不是直接移动相应的位数,而是先将位数对32取余,对余数对应的数进行相应位次的移动。如1<<35=1<<(35%32)=1<<3=8。

按位异或用于交换整数

按位异或的特点可以用在整数交换上面,除了按位异或交换,还有其他两种交换方式。

 1 public class ChangeMethod{
 2     public static void main(String[] args){
 3         //交换值的三种方式
 4         //option1 按位异或交换,用于整数
 5         int a=5;
 6         int b=7;
 7         a=a^b;
 8         b=a^b;//b=a^b^b=a
 9         a=a^b;//a=a^b^a=b^a^a=b
10         System.out.println(a);
11         System.out.println(b);
12
13         //option2 加减法交换,用于所有数值,除了整数还可以用其他数
14         int x=5;
15         int y=7;
16         x=x+y;
17         y=x-y;//y=x+y-y=x
18         x=x-y;//x=x+y-x=y
19         System.out.println(x);
20         System.out.println(y);
21
22         //option3 中间值交换,也叫做追尾法交换,适用所有类型
23         int i=5;
24         int j=7;
25         int temp=i;
26         i=j;
27         j=temp;
28         System.out.println(i);
29         System.out.println(j);
30
31     }
32 }

交换结果

以上三种交换方式各有优缺点,总结就是以下几点,异或法效率最好,追尾法效率最低,使用频率上异或法最低,追尾法最高。

总结

(1)位运算目前学的一共有7种,进行运算时都需要转换为补码进行移动。

(2)按位异或位运算可以用于交换两个整数。

参考博文:

(1)https://www.cnblogs.com/youngchaolin/p/10463887.html#_label4

(2)https://www.cnblogs.com/youngchaolin/p/11290467.html

原文地址:https://www.cnblogs.com/youngchaolin/p/11291809.html

时间: 2024-12-16 02:20:06

Java位运算基础知识的相关文章

【Java基础】Java位运算

/* * JAVA位运算: 与(&).非(~).或(|).异或(^).左移(<<).右移(>>) *+-----------------------------------------------------------------------------------+ *| & | 当两边操作数的位同时为1时,结果为1,否则为0 如1 1 0 0 & 1 0 1 0 = 1 0 0 0 | *+-------------------------------

Java 位运算超全面总结

1.原码.反码.补码 关于原码.反码.补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请老铁自行 Google,不过有篇知乎回答是作者学编程以来见过对相关知识最通俗易懂,生动简洁的解释:对原码.反码.补码最通俗易懂,生动简洁的解释,墙裂建议大家先看完这篇科普文章.在继续讨论之前你要先明白一点:整数在计算机内部都是以补码形式存储的. 2.Java 位运算概览 OK 都看到这儿了那我就假定你已经掌握了原码.反码.补码相关知识(虽然上面那段几乎啥也没讲,纯凑字数) 不废话了.

Java位运算总结:位运算用途广泛《转》

前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天系统研究了下,现记录如下. 首先要明白一个概念,Java位运算是针对于整型数据类型的二进制进行的移位操作.主要包括位与.位或.位非,有符号左移.有符号右移,无符号右移等等.需要注意一点的是,不存在无符号左移<<<运算符.根据位运算的概念规定,我们首先需要弄明白两个问题,java有哪些数据类型

Java语言的基础知识

第三章 1.在java源文件编辑器中,选择某个成员变量,然后按住shift+alt+j,Eclipse会自动添加JavaDoc文档注释结构,如果选择的是方法,还会自动添加参数名称. 2.Java语言规定标示符是由任意的字母.下划线.美元符号和数字组成,并且第一个字符不能使数字,标示符不能使java中的保留关键字. 3.在Java语言中允许使用汉字或其他语言文字作为变量名,如int 年龄 =21;在程序运行时不会报错,但建议尽量不要使用这些语言作为变量. 4.java用关键字final来声明常量,

Java并发(基础知识)—— Executor框架及线程池

在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有问题的,但是当需要创建大量线程时就会出现问题,因为这种使用方法把线程创建语句随意地散落在代码中,无法统一管理线程,我们将无法管理创建线程的数量,而过量的线程创建将直接使系统崩溃. 从高内聚角度讲,我们应该创建一个统一的创建以及运行接口,为我们管理这些线程,这个统一的创建与运行接口就是JDK 5的Ex

Java语言的基础知识4

第五章(数组) 1.在Java中可以将数组看做是一个对象虽然基本数据类型不是对象但有基本数据类型组成的数组是对象. 2.对于二维数组求第二维就用array[0].length, array.length就是默认的是第一维的长度. 3.foreach并不是一个新的语法它是for的循环的格式化主要执行遍历功能的循环,example: int arry ={1,2,3,4,5}; for(int i :array){ system.out.println(): } 4.数组元素定义完以后可通过Arra

黑马程序员——Java I/O基础知识之I/O流

I/O流基础知识--字节流和字符流 文件存储在硬盘中,是以二进制表示的,只有内存中才能形成字符.数据的来源可以有硬盘,内存,控制台,网络,Java把数据从一个地方转到另一个地方的现象称为流,用InputStream和OutputStream接口来表示,这两个流里面的都是以字节为单位的,后来加入了Reader和Writer,里面操作的是字符,是两个字节为单位的. 字节流 字节流将数据写入文件 try { File file =new File("d:" +File .separator+

Java 位运算

一,Java 位运算 1.表示方法: 在Java语言中,二进制数使用补码表示,最高位为符号位,正数的符号位为0,负数为1.补码的表示需要满足如下要求. (l)正数的最高位为0,其余各位代表数值本身(二进制数). (2)对于负数,通过对该数绝对值的补码按位取反,再对整个数加1. 2.位运算符 位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算.位运算符可以分为逻辑运算符(包括~.&.|和^)及移位运算符(包括>>.<<和>>>). 1)左

Java语言的基础知识12

第十四章(使用集合类保存对象) 1.java中得集合对象就像是一个容器,它用来存放Java类的对象.Java中的集合类有些方便存入和取出,有些则方便查找.集合类和数组的区别是,数组的长度是固定的,集合的长度是可变的,数组用来存放基本类型,集合用来存放对象的引用.常用的集合类有List集合,Set集合,和Map集合. 2.List集合包括List接口以及List接口的所有实现类.List集合中的元素许重复,个元素的顺序就是对象插入的顺序.类似java中的数组.List类继承了Collection接