一、位操作符

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

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

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

位操作都是对二进制而言的,但是我们平常使用的都是十进制比如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. 在centos6.5下搭建lnmp

    1.查看环境: [root@localhost /]# cat /etc/redhat-release CentOS release 6.5 (Final)   2.关掉防火墙(需要到国外地址下载软件 ...

  2. Agumaster 增加雪球网爬虫

  3. Tomcat源码分析(下载、启动)

    1.下载Tomcat源代码: https://tomcat.apache.org/download-80.cgi 2. 解压以及创建必要目录和配置 解压.新建catalina-home目录,同时将目录 ...

  4. 关于h5游戏开发,你想了解的一切都在这儿!

    ​2020年,受疫情影响,线下产业红利褪去,线上迎来的新一轮的高峰.众多商家纷纷抓住了转型时机,开启了流量争夺战.H5游戏定制无疑是今年引流的大热门.如何开发一款有趣.有爆点.用户爱买单的好游戏呢? ...

  5. 如何《快速搭建LAMP环境》

    阿里云体验平台简介 阿里云开发者实验室提供免费云资源和丰富的场景化实践,旨在帮助开发者在学习应用技术,了解阿里云产品的特性. 教程介绍 本教程引用自阿里云体验实验室介绍如何快速搭建Docker环境,并 ...

  6. 乔悟空-CTF-i春秋-Web-GetFlag

    2020.09.07 今天发生了一些事情,世事无常,哎.好好的享受当下,该吃吃该喝喝好吧.人活一辈子,到底为了啥? 做题 题目 题目地址 做题 这个题目还行,思路比较清晰,没那么多奇怪的脑洞

  7. 口罩预约管理系统——数据库设计(前端+PHP+MySQL)

    目录 一.背景 二.口罩预约管理系统介绍 三.数据库设计 四.MySQL创建数据库以及数据表 五.数据库设计总结 一.背景 2020年的疫情影响了我们的生产生活,政府不断加大力度联防联控,遏制疫情的蔓 ...

  8. k8s控制器资源

    k8s控制器资源   Pod pod在之前说过,pod是kubernetes集群中是最小的调度单元,pod中可以运行多个容器,而node又可以包含多个pod,关系如下图: 在对pod的用法进行说明之前 ...

  9. ES6重度学习 demo实例

    let 与 const // 并非真正的常量 // const 的本质: const 定义的变量并非常量,并非不可变, // 它定义了一个常量引用一个值.使用 const 定义的对象或者数组,其实是可 ...

  10. 学习使用PSTools工具中的psping

    目录 初识PsTools psping 1.使用ICMP ping 2.使用TCP ping 3.延迟测试 4.带宽测试 5.同功能的tcping工具 总结 初识PsTools     在工作中我们都 ...