一、位操作符

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

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

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

位操作都是对二进制而言的,但是我们平常使用的都是十进制比如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. el-dialog“闪动”解决办法

    问题描述:el-dialog关闭的时候总是出现两次弹窗 解决思路:既然是el-dialog产生的那就直接杀掉el-dialog 代码实践:在el-dialog上添加上一个v-if,值就是用闭窗的值,促 ...

  2. 利用OpenCV进行H264视频编码的简易方式

    在Python下,利用pip安装预编译的opencv库,并实现h264格式的视频编码. 1. 安装OpenCV $ pip install opencv-python 建议在python虚拟环境下安装 ...

  3. Python多线程爬虫详解

    一.程序进程和线程之间的关系 程序:一个应用就是一个程序,比如:qq,爬虫 进程:程序运行的资源分配最小单位, 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知 ...

  4. .NET Core 中导入导出Excel

    操作Excel是一个比较常见的业务场景,本篇将使用EPPlus简单演示一个导入导出的示例. EPPlus开源地址:https://github.com/EPPlusSoftware/EPPlus 在项 ...

  5. 【python】我OUT了,原来函数中的冒号和箭头是这么回事

    翻了翻httprunner的源代码,越看越不对劲,感觉有点看不懂语法了. 这都什么鬼?感觉心好慌,顿时感到惭愧万分,还好意思说自己了解Python呢. 赶紧了解一下,原来这叫 type hints,是 ...

  6. CSDN自定义栏目代码

    今天终于发现了csdn可以操作的地方,有个自定义栏目的地方可以贴HTML代码(只允许最多一个自定义栏目),不能用JS插件 有点难受,就贴了下自己的微信,并且可以直接点击图片发起会话 以下是我的代码,可 ...

  7. java初探(1)之静态页面化——客户端缓存

    利用服务端缓存技术,将页面和对象缓存在redis中,可以减少时间浪费,内存开销.但在每次请求的过程中,仍然会有大量静态资源的请求和返回. 使用静态页面技术,页面不必要使用页面交互技术,比如thymel ...

  8. 2019 HNCPC D Modulo Nine 数位DP

    题意 给定长度n和m个限制(l,r),每一个限制的意义是\(a_l \times a_{l+1} \times ... a_r = 0 \quad mod\ 9\). 问有多少个满足所有条件且长度为n ...

  9. linux 文件系统和磁盘

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

  10. leetcode刷题-61旋转链表

    题目 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = 2输出: 4 ...