一、位操作符

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

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

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

位操作都是对二进制而言的,但是我们平常使用的都是十进制比如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. 软件人如何快速晋升CTO(一)

    1.场景描述 ​ 软件人如何快速晋升CTO? 实战操作,介绍下如何0成本拥有自己的软件公司,出任CTO/CEO. ​ 2020年 8月16日,软件老王拿到公司的营业执照和公章了,税务登记也一起办理好了 ...

  2. win10找不到wifi

    禁用->启用  就能用了.

  3. 替换unimrcp的VAD模块

    摘要: unimrcp vad 模块voice activity dector一直认为比较粗暴,而且unimrcp的社区也很久没有更新了.使用原始unimrcp如果只是用来做Demo演示,通过手动调整 ...

  4. AI研讨会直播:《人工智能开发前沿》实战系列公开课第1期

    报名链接:https://www.slidestalk.com/m/276 活动背景 业务需求.数据.算法.算力等因素,决定人工智能技术走向产业落地面临各种挑战.博客园联合示说网以及产业内人工智能技术 ...

  5. python中的一些内置函数

    1.布尔类型 2.求和sum 3.取全局变量和局部变量 4.ascii码和字符集 chr().ord() 5.看某个功能下有哪些方法 help(x).dir(x) 6.exec执行python代码 7 ...

  6. python 3 for与while嵌套

  7. Python全栈工程师系列学习之学习记录

    @ 目录 前言 Day 01 一.python的历史和种类 二.安装python解释器以及配置环境变量 三.变量.常量和注释 Day 02 Day 03 Day 04 Day 05 Day 06 一. ...

  8. axios post提交数据的三种请求方式

    1.Content-Type: application/json import axios from 'axios' let data = {"code":"1234&q ...

  9. JDK15正式发布,新增功能预览!

    JDK 15 在 2020 年 9 月 15 号正式发布了,这次发布的主要功能有: JEP 339:EdDSA 数字签名算法 JEP 360:密封类(预览) JEP 371:隐藏类 JEP 372:删 ...

  10. Prometheus Metrics 设计的最佳实践和应用实例,看这篇够了!

    Prometheus 是一个开源的监控解决方案,部署简单易使用,难点在于如何设计符合特定需求的 Metrics 去全面高效地反映系统实时状态,以助力故障问题的发现与定位.本文即基于最佳实践的 Metr ...