前言
我们都知道对于有符号数据类型,二进制最左端的数字为符号位,0代表正,1代表负,这里先介绍几个概念
逻辑左移=算术左移:高位溢出,低位补0
逻辑右移:低位溢出,高位补0
算术右移:低位溢出,高位用符号位的值补
比如一个有符号位的8位二进制数10101010,[]是添加的数字
逻辑左移一位:0101010[0]
逻辑左移两位:101010[00]
算术左移一位:0101010[0]
算术左移两位:101010[00]
逻辑右移一位:[0]1010101
逻辑右移两位:[00]101010
算术右移一位:[1]1010101
算术右移两位:[11]101010
算术左移和算术右移主要用来进行有符号数的倍增、减半
逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半
(Java中是没有无符号数据类型的,C和C++中有)
符号 例子 解释
<< num<< n 相当于 num×2n,算数左移(逻辑左移)
【Java中的>>,>>>】num>>n 相当于num2n,算数右移
num>>>n 逻辑右移,当num为正数和算术右移一个效
@Test
public void test1() {
//System.out.println(1<<1);
//System.out.println((float) (1>>1));
int num = 10;
System.out.println(Integer.toBinaryString(0));
System.out.println(Integer.toBinaryString(1));
System.out.println(Integer.toBinaryString(2));
System.out.println(Integer.toBinaryString(3));
System.out.println(Integer.toBinaryString(4));
System.out.println(Integer.toBinaryString(5));
System.out.println(Integer.toBinaryString(100));
System.out.println("-------------");
//System.out.println(Integer.toBinaryString(6));
System.out.println(Integer.toBinaryString(8));
System.out.println(Integer.toBinaryString(16));
System.out.println(Integer.toBinaryString(13));
System.out.println(Integer.toBinaryString(~13));
System.out.println("-------------");
System.out.println(Integer.toBinaryString(num));
System.out.println(Integer.toBinaryString(num << 1));
System.out.println(Integer.toBinaryString(num>>1));
System.out.println(Integer.toBinaryString(num>>2));
System.out.println(Integer.toBinaryString(num>>4));
System.out.println("---------------");
System.out.println(Integer.toBinaryString(2 & 3));
System.out.println(Integer.toBinaryString(2 | 3));
System.out.println(Integer.toBinaryString(~2));
System.out.println(Integer.toBinaryString(~3));
System.out.println("---------------");
System.out.println(200 & ~200);
System.out.println("---------------");
//无符号右移运算符>>> 只是对32位和64位的值有意义
System.out.println(Integer.toBinaryString(~2>>>4));
System.out.println(Integer.toBinaryString(~2>>>33));
// 20
System.out.println(10 << 1);
// -20
System.out.println(-10 << 1);
// 5
System.out.println(10 >> 1);
// -5
System.out.println(-10 >> 1);
// 5
System.out.println(10 >>> 1);
// 2147483643
System.out.println(-10 >>> 1);
//result://0
//1
//10
//11
//100
//101
//1100100
//-------------
//1000
//10000
//1101
//11111111111111111111111111110010
//-------------
//1010
//10100
//101
//10
//0
//---------------
//10
//11
//11111111111111111111111111111101
//11111111111111111111111111111100
//---------------
//0
//---------------
//1111111111111111111111111111
//1111111111111111111111111111110
//20
//-20
//5
//-5
//5
//2147483643
}
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)