一、位操作符

位操作符在实际工作中用的并不常见,但是我比较纠结这些位操作。所以实际练习位操作符的每一个操作符的操作实例来理解其具体含义。

建议: 如果确实感兴趣,就看看,个人建议跳过这个章节。 真正工作用到了,再来看。

二、一个整数的二进制表达

位操作都是对二进制而言的,但是我们平常使用的都是十进制比如5。

而5的二进制是101。

所以在开始学习之前,需要掌握一个整数的二进制表达是多少。

通过Integer.toBinaryString() 方法,将一个十进制整数转换为一个二进制字符串

public class HelloWorld {

public static
void main(String[] args) {

int i = 5;

String b = (Integer.toBinaryString(i)); // 5的二进制的表达101

System.out.println(i+" 的二进制表达是: "+b);

}

}

三、位或

5的二进制是101

6的二进制是110

所以 5|6 对每一位进行或运算,得到 111->7

详解:

1 0 1

1 1 0

进行或运算,任意一位是1,则该位变为1

所以对

1 0 1

1 1 0

进行或运算的结果是

1 1 1

111的十进制数为7

public class HelloWorld {

public static
void main(String[] args) {

int i  =5;

int j = 6;

System.out.println(Integer.toBinaryString(i)); //5的二进制是101

System.out.println(Integer.toBinaryString(j)); //6的二进制是110

System.out.println(i|j); //所以 5|6 对每一位进行或运算,得到 111->7

}

}

四、位与

5的二进制是101

6的二进制是110

所以 5&6 对每一位进行与运算,得到 100->4

详解:

1 0 1

1 1 0

进行与运算,任意一位是0,则该位变为0

所以对

1 0 1

1 1 0

进行与运算的结果是

1 0 0

100的十进制数为4

public class HelloWorld {

public static
void main(String[] args) {

int i  =5;

int j = 6;

System.out.println(Integer.toBinaryString(i)); //5的二进制是101

System.out.println(Integer.toBinaryString(j)); //6的二进制是110

System.out.println(i&j); //所以 5&6 对每一位进行与运算,得到 100->4

}

}

五、异或

5的二进制是101

6的二进制是110

所以 5^6 对每一位进行异或运算,得到 011->3

一些特别情况:

任何数和自己进行异或 都等于 0

任何数和0 进行异或 都等于自己

public class HelloWorld {

public static
void main(String[] args) {

int i  =5;

int j = 6;

System.out.println(Integer.toBinaryString(i)); //5的二进制是 101

System.out.println(Integer.toBinaryString(j)); //6的二进制是110

System.out.println(i^j); //所以 5^6 对每一位进行或运算,得到 011->3

System.out.println(i^0);

System.out.println(i^i);

}

}

六、取非

5 的二进制是 00000101

所以取反即为 11111010

这个二进制换算成十进制即为-6

public class HelloWorld {

public static
void main(String[] args) {

byte i  =5;

System.out.println(Integer.toBinaryString(i)); //5的二进制是00000101,所以取非即为11111010,即为-6

System.out.println(~i);

}

}

七、左移、右移

左移:根据一个整数的二进制表达,将其每一位都向左移动,最右边一位补0

右移:根据一个整数的二进制表达,将其每一位都向右移动

public class HelloWorld {

public static
void main(String[] args) {

byte i  =6;

//6的二进制是110

System.out.println(Integer.toBinaryString(i));

//6向左移1位后,变成1100,对应的10进制是12

System.out.println(i<<1);

//6向右移1位后,变成11,对应的10进制是3

System.out.println(i>>1);

}

}

八、练习--快速计算2*16

不用乘法符号(*) 计算 2x16

官方答案:

使用 2 * 16的方式相对于 2<<4 位移会更慢一点, 2<<4位移的方式是最快的

public class HelloWorld {

public static
void main(String[] args) {

int i = 2;

int j = 2*16; //使用乘法

System.out.println("j=2*16:\t"+j);

int k = 2<<4;

System.out.println("k=2<<4:\t"+k);

}

}

九、带符号右移与无符号右移

带符号右移 >>

对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0

对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1

无符号右移>>>

如果是一个负数,那么对应的二进制的第一位是1

无符号右移>>>会把第一位的1也向右移动,导致移动后,第一位变成0

这样就会使得负数在无符号右移后,得到一个正数

简单的说:

带符号右移 >> 移动后正的还是正的,负的还是负的,符号不变

无符号右移>>>移动后,变正的了

public class HelloWorld {

public static
void main(String[] args) {

int i  =-10;

//-10的二进制是11111111111111111111111111110110

//第一位是1,即符号位,代表这是一个负数

System.out.println(Integer.toBinaryString(i));

//对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补0

//对于负数, 带符号右移 >> 会把所有的位右移,并在最前面补1

//-10带符号右移1位,移动后前面补齐1

//得到11111111111111111111111111111011

//因为第一位是1,所以依然是一个负数,对应的十进制是-5

int j = i>>1;

System.out.println(Integer.toBinaryString(j));

System.out.println(j);

//-10无符号向右移1位,符号位也会向右移,第一位就变成了0

//得到01111111111111111111111111111011,对应的十进制是2147483643

int k = i>>>1;

System.out.println(Integer.toBinaryString(k));

System.out.println(k);

}

}

十、练习--位操作符

题目:

int i = 3; // 二进制是11

int j = 2; // 二进制是10

int c = ((i | j) ^ (i & j)) << 2 >>> 1;

心算答案,不要一来就放在eclipse中计算结果

官方答案:

public class HelloWorld {

public static void main(String[] args) {

int i = 3; // 二进制是11

int j = 2; // 二进制是10

int c = ((i | j) ^ (i & j)) << 2 >>> 1;

//          11

//                    10

//               01

//                            0100

//                                  010

//010=2

}

}

Java知识系统回顾整理01基础04操作符04位操作符的更多相关文章

  1. Java知识系统回顾整理01基础03变量04类型转换

    一.不同类型之间的数据可以互相转换,但是要满足一定的规则 二.数据类型转换规则 转换规则如图所示  精度高的数据类型就像容量大的杯子,可以放更大的数据 精度低的数据类型就像容量小的杯子,只能放更小的数 ...

  2. Java知识系统回顾整理01基础06数组04增强型for循环

    增强型for循环在遍历一个数组的时候会更加快捷 一.增强型for循环 注:增强型for循环只能用来取值,却不能用来修改数组里的值 public class HelloWorld { public st ...

  3. Java知识系统回顾整理01基础04操作符01算术操作符

    一.算数操作符类别 基本的有: + - * / % 自增 自减: ++ -- 二.基本算数操作符 + - * / 基本的加 减 乘 除 public class HelloWorld { public ...

  4. Java知识系统回顾整理01基础04操作符06三元运算符

    一.三元运算符 表达式?值1:值2 如果表达式为真 返回值1 如果表达式为假 返回值2 if语句学习链接:if语句 public class HelloWorld { public static vo ...

  5. Java知识系统回顾整理01基础04操作符02关系操作符

    一.关系操作符 关系操作符:比较两个变量之间的关系  > 大于 >= 大于或等于 < 小于 <= 小于或等于 == 是否相等 != 是否不等 public class Hell ...

  6. Java知识系统回顾整理01基础01第一个程序04创建Eclipse项目

    一.为Eclipse设置桌面快捷方式图标 二.双击桌面快捷方式打开Eclipse 三.选择工作区 使用在命令行Hello World中的项目目录e:\project 除了第一次启动eclipse的时候 ...

  7. Java知识系统回顾整理01基础05控制流程04 for

    一.for 比较for和while public class HelloWorld { public static void main(String[] args) { //使用while打印0到4 ...

  8. Java知识系统回顾整理01基础04操作符07Scanner

    一.Scanner 需要用到从控制台输入数据时,使用Scanner类. 二.使用Scanner读取整数 注意: 使用Scanner类,需要在最前面加上 import java.util.Scanner ...

  9. Java知识系统回顾整理01基础04操作符05赋值操作符

    一.赋值操作 赋值操作的操作顺序是从右到左 int i = 5+5; 首先进行5+5的运算,得到结果10,然后把10这个值,赋给i public class HelloWorld { public s ...

随机推荐

  1. Xutils 的框架问题retry error, curr request is null Android开发之网络请问问题

    没有网络权限也能导致这个问题 也可能是因为模拟机没联网的问题

  2. 如何写好转正答辩PPT

    如何写好一个转正答辩报告 几个月前,我刚经历了转正答辩,这是我职业生涯中转正答辩表现最好的一次.在我之前经历的几家公司中,转正的流程各不相同,我将它们为主动式和被动式.这里的被动式指的是:公司是主动方 ...

  3. Mac OSX上安装Nginx

    1. 通过brew instal nginx安装 ==> Downloading https://homebrew.bintray.com/bottles/nginx-1.10.1.el_cap ...

  4. python学习笔记回忆录02

    1.for循环 依次按顺序从列表中取出值,直到遍历完整个列表为止 the_count =[1,2,3,4,5] for number in the_count: print "this is ...

  5. linux 文件系统和磁盘

    linux 文件系统和磁盘 1.文件系统 ext2, ext3, ext4 , XFS ext3和ext4为日志文件系统 文件系统格式 : 磁盘格式化为 inode和block inode是索引,记录 ...

  6. Charles安装教程

    一, 简介及安装 —,charles的使用 1.1   charles的说明 Charles其实是一款代理服务器,通过过将自己设置成系统(电脑或者浏览器)的网络访问代理服务器,然后截取请求和请求结果达 ...

  7. JSON<前后端的沟通>

    1.什么是JSON ==>1什么是json json:是一种轻量级数据交互格式 数据交互:每一种语言的编码都不一样,他们之间互不认识.但是现在的情况是不同的语言开发出的系统也需要进行数据交互,这 ...

  8. leetcode刷题-52N皇后2

    题目 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击.给定一个整数 n,返回 n 皇后不同的解决方案的数量. 思路 与51题完全一致 实现 class ...

  9. Spring Boot入门,源码解析

    目录 1.Spring Boot简介 2.微服务 3.Spring Boot HelloWorld 3.1 创建一个Maven工程 3.2 导入依赖Spring Boot相关的依赖 3.3 编写一个主 ...

  10. IDEA下Git分支开发

    IDEA下Git分支开发使用 1.新建本地开发分支 VCS-->git-->branches-->New Branch,输入分支名字,如branch_test,点击OK后本地开发分支 ...