在计算机中所有数据都是以二进制的形式储存的。

位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。

方便演示,首先写个二进制打印方法:

private static void printNum(int n){
String num = Integer.toBinaryString(n);
if(num.length() == 32){
System.out.println(num);
}else{
StringBuilder sb = new StringBuilder("");
for(int i =0;i < 32 - num.length(); i ++){
sb.append("0");
}
System.out.println(sb.toString() + num);
}
}

1、~操作符(取反),对应二进制位取反,0变成1,1变成0

int num = 3;
printNum(num);
printNum(~num);

结果如下:

00000000000000000000000000000011
11111111111111111111111111111100

2、&操作符(与),对应二进制位进行与操作,都为1时变成1,其他变为0

int num1 = 3;
int num2 = 7;
printNum(num1);
printNum(num2);
printNum(num1 & num2);

结果如下:

00000000000000000000000000000011
00000000000000000000000000000111
00000000000000000000000000000011

3、|操作符(或)对应二进制位进行或操作,都为0时变成0,其他变为1

int num1 = 4;
int num2 = 7;
printNum(num1);
printNum(num2);
printNum(num1 | num2);

结果如下:

00000000000000000000000000000100
00000000000000000000000000000111
00000000000000000000000000000111

4、^操作符(异或),对应二进制位相同时,该位变成0,否则变成1

int num1 = 5;
int num2 = 9;
printNum(num1);
printNum(num2);
printNum(num1 ^ num2);

结果如下:

00000000000000000000000000000101
00000000000000000000000000001001
00000000000000000000000000001100

5、<<操作(左移),二进制位向左移动,右边填充0

int num1 = 5;
printNum(num1);
printNum(num1 << 2);

结果如下:

00000000000000000000000000000101
00000000000000000000000000010100

6、>>操作(右移),二进制位向右移动,左边填充0

int num1 = 5;
printNum(num1);
printNum(num1 >> 2);

结果如下:

00000000000000000000000000000101
00000000000000000000000000000001

位操作常见应用

1、不使用中间变量交换两个数

int num1 = 2;
int num2 = 5;
num1 = num1^num2;
num2 = num2^num1;
num1 = num1^num2;
System.out.println("num1:" + num1 +"\n"+ "num2:" + num2 );

2、求2的N次方

//求2的32次方:
System.out.println(Math.pow(2, 32));
System.out.println(1L<<32);

3、判断奇数偶数

int num1 = 4;
int num2 = 9;
if(num1%2 == 0){
System.out.println("偶数");
}else{
System.out.println("奇数");
}
System.out.println((((int)num1&1) == 1) ? "奇数" : "偶数");
System.out.println((((int)num2&1) == 1) ? "奇数" : "偶数");

4、求绝对值

int num = -3;
System.out.println(Math.abs(num));
int i = num >> 31;
System.out.println(i == 0 ? num : (~num + 1));

java位操作总结的更多相关文章

  1. Java位操作全面总结

    转载: Java位操作全面总结 在计算机中所有数据都是以二进制的形式储存的.位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快.在实际编程中,如果能巧妙运用位操作,完全可以达到 ...

  2. JAVA 位操作学习

    一,基础知识 计算机中数值的编码方式中,原码.反码.补码. 正数的补码与原码相同,负数的补码为:负数的原码符号位不变,其它位取反,再加1. 在计算机中,数值是以补码的形式存储的.补码的好处: ①用补码 ...

  3. Java位操作全面总结[ZZ]

    Java位操作全面总结 在计算机中所有数据都是以二进制的形式储存的.位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快.在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千 ...

  4. java 位操作 bitwise(按位) operation bit

    java 位操作 bitwise(按位) operation bit //一篇对于 原码 反码 补码 的介绍 http://www.cnblogs.com/zhangziqiu/archive/201 ...

  5. 一道面试题与Java位操作 和 BitSet 库的使用

    前一段时间在网上看到这样一道面试题: 有个老的手机短信程序,由于当时的手机CPU,内存都很烂.所以这个短信程序只能记住256条短信,多了就删了. 每个短信有个唯一的ID,在0到255之间.当然用户可能 ...

  6. java 位操作的总结

    2014-05-07 17:14 今天工作上需要一个Byte的低5位,高3位.所以查询了资料.总结下如何实现 百度到一个资料: 介绍的很详细 基础知识: http://www.blogjava.net ...

  7. Java位操作

    无论说是在哪一门计算机语言,位操作运算对于计算机来说肯定是最高效的,因为计算机的底层是按就是二进制,而位操作就是为了节省开销,加快程序的执行速度,以及真正的实现对数的二进制操作.      使用位操作 ...

  8. 可能是最通俗易懂的 Java 位操作运算讲解

    https://blog.csdn.net/briblue/article/details/70296326

  9. 通俗易懂的 Java 位操作运算讲解

    所有数值都是2进制 软件开发者都知道 10 进制.16 进制.8 进制. 比如数字 10 的各位进制形式表现如下. 十进制:10 八进制:012 十六进制:0x0a 二进制:1010 原码 反码 补码 ...

随机推荐

  1. html 图像映射(一个图像多个连接)

    以前就见过那种导航地图,点击地图的不同省份分别跳到不同的连接,现在用html实现一下,简单的. 图像映射是指一个图像可以建立多个连接,就是在图像上面定义多个区域,每个区域连接到不同的地址. 效果如图: ...

  2. R中的<-和=赋值符号的细致区别

    <-创建的变量的作用范围可以在整个顶层环境,而=仅仅在一个局部环境. 但要<-创建的变量如果是在函数实参传递的时候创建的,其的作用范围可以在整个顶层环境,有一个前提条件:对应的形参在函数内 ...

  3. Java虚拟机 safepoints 初探

    safepoint的定义很不规范,还跟JVM的具体实现有关,我们的讨论主要针对Hotspot VM. 先看看openjdk的官方解释:  http://openjdk.java.net/groups/ ...

  4. ANT的安装

    1.下载ANT http://ant.apache.org/bindownload.cgi 2.将下载下来的压缩包解压到任意文件夹下,例如D盘根目录下D:/apache-ant-1.9.2 3.添加环 ...

  5. 页面localStorage用作数据缓存的简易封装

    最近做了一些前端控件的封装,需要用到数据本地存储,开始采用cookie,发现很容易就超过了cookie的容量限制,于是改用localStorage,但localStorage过于简单,没有任何管理和限 ...

  6. https://zeroc.com/index.html

    https://zeroc.com/index.html http://blog.shutupandcode.net/?p=1085

  7. 启动apache和tomcat端口被占用解决办法

    1,打开控制台,使用命令 netstat -aon|findstr 8090  找出端口被占用的进程, 2,使用 taskkill -f -pid 4116(进程id)杀掉当前占用端口的进程

  8. linux c 笔记-1

    指令帮助: man xxx_command man 2 xxx_command man 3 xxx_command eg. 打开文件的函数open, 如果不清楚传参,则 man open man 2 ...

  9. Android手机截屏方法

    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <u ...

  10. OOCSS的概念和思路

    <概念> <思路> 面向对象的CSS有两个原则: 独立的结构和样式 独立的容器和内容 以下几点是创建OOCSS的关键部分: 创建一个组件库 独立的容器和内容,并且避免样式来依赖 ...