操作符系列教材 (四)- Java的位操作符
位操作符在实际工作中用的并不常见,但是同学们总是很喜欢纠结这些位操作。

所以本章节会给出每一个操作符的操作实例帮助大家理解其具体含义。

最后说,如果确实感兴趣,就看看,个人建议跳过这个章节。 真正工作用到了,再来看。
步骤1:一个整数的二进制表达
步骤2:位或
步骤3:位与
步骤4:异或
步骤5:取非
步骤6:左移 右移
步骤7:练习-快速计算2x16
步骤8:答案-快速计算2x16
步骤9:带符号右移与无符号右移
步骤10:练习-位操作符
步骤11:答案-位操作符
示例 1 : 一个整数的二进制表达
位操作都是对二进制而言的,但是我们平常使用的都是十进制比如5。
而5的二进制是101。
所以在开始学习之前,需要掌握一个整数的二进制表达是多少。
通过Integer.toBinaryString() 方法,将一个十进制整数转换为一个二进制字符串

public class HelloWorld {public static void main(String[] args) {int i = 5;String b = (Integer.toBinaryString(i)); // 5的二进制的表达101System.out.println(i+" 的二进制表达是: "+b);}}

示例 2 : 位或
5的二进制是101
6的二进制是110
所以 5|6 对每一位进行或运算,得到 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 }}

示例 3 : 位与
5的二进制是101
6的二进制是110
所以 5&6 对每一位进行与运算,得到 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 }}

示例 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的二进制是 101System.out.println(Integer.toBinaryString(j)); //6的二进制是110System.out.println(i^j); //所以 5^6 对每一位进行或运算,得到 011->3         System.out.println(i^0);System.out.println(i^i);}}

示例 5 : 取非
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); } }

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

public class HelloWorld {public static void main(String[] args) {byte i  =6; //6的二进制是110System.out.println(Integer.toBinaryString(i));//6向左移1位后,变成1100,对应的10进制是12System.out.println(i<<1);//6向右移1位后,变成11,对应的10进制是3System.out.println(i>>1);} }

示例 9 : 带符号右移与无符号右移
带符号右移 >>
对于正数, 带符号右移 >> 会把所有的位右移,并在最前面补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,所以依然是一个负数,对应的十进制是-5int j = i>>1;System.out.println(Integer.toBinaryString(j));System.out.println(j); //-10无符号向右移1位,符号位也会向右移,第一位就变成了0//得到01111111111111111111111111111011,对应的十进制是2147483643int k = i>>>1;System.out.println(Integer.toBinaryString(k));                      System.out.println(k);} }

更多内容,点击了解: https://how2j.cn/k/operator/operator-bitwise/270.html

©著作权归作者所有:来自51CTO博客作者wx5c4afeea27343的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 变量系列教材 (八)- 什么是Java的表达式
  2. HelloWorld系列教材 (五)- 在Eclipse中运行第一个 java 程序
  3. 面向对象系列教材 (一)- Java中的类和对象
  4. HelloWorld系列教材 (四)- 使用ecipse创建第一个 java project
  5. HelloWorld系列教材 (二)- 用命令行中编写第一个 java 程序
  6. 操作符系列教材 (一)- Java的算数操作符
  7. 变量系列教材 (九)- 什么是Java的块
  8. Windows如何安装mysql数据库!
  9. 关于修改密码带特殊符号以及数据泵参数设置的一些小知识(2)

随机推荐

  1. 太强了!这两款数据库中间件,完美解决 Sprin
  2. Spring Boot 项目中的三种多数据源方案,一
  3. 丢弃掉那些 BeanUtils 工具类吧,MapStruct
  4. 用 NodeJS 充分利用多核 CPU 的资源[每日
  5. IDEA + Spring Boot 的三种热加载方案,看
  6. 用 cURL 请求测试 ETag 浏览器缓存[每日
  7. 69.批量创建mysql用户
  8. 香~Spring Boot 应用也可以有注册中心。
  9. 香~Spring Boot 应用也可以有配置中心。
  10. W3C TPAC 大会上的 Service workers 内容