Java 位运算
前言
最近在重学java基础,虽然自己本身是做android开发的。包括现在kotlin已经成为google推崇的第一编程语言。其实我认为kotlin更像是站在巨人的肩膀上开发,他从来不是为了取代java而出现的。因为kotlin文件最终也会编译成class文件,感觉自己越学越不会或者说是感觉现在不知道该学什么。所以现在打算重新学习,从Java基础开始。老话说的好“地基不牢,地动山摇”。越是学习越觉得应该返璞归真。
位运算
虽然在开发中不经常使用位运算,但是在翻看源码的时候会时不时遇到:逻辑左移(<<)、逻辑右移(>>)、亦或(^)等。还是有必要了解一下的,特此记录学习过程。
运算符 | 运算 | 说明 |
---|---|---|
<< | 左移 | 将数化为二进制左移多少位后面补多少零=数*2^(多少位) |
>> | 右移 | 是负数移动位补1,正数移动位补0 |
>>> | 无符号右移 | 移动多少位补多少0 |
& | 与运算 | 两个数的二进制相应位都是1为1,否则是0 |
| | 或运算 | 两个数有1为1,否则为0 |
^ | 亦或运算 | 两个数的二进制位相同为0,否则为1 |
~ | 取反运算 | 包括符号位在内逐位取反 |
说明:正数的原、反、补码是自己二进制本身。负数的反码是二进制除符号位外逐位取反、补码是在反码的基础上加1
1.左移
说明:左移动多少位,低位补多少个0。
例如:-15左移两位 -15 << 2
最后将1…111100换算成10进制得到-60
2.右移
说明:如果是负数,右移动多少位最高位补多少个1。如果是正数右移动多少位高位补多少0。
例如:-15右移两位 -15 >> 2
最后将1…0100换算成十进制得到-4
3.无符号右移动
说明:不管是正数还是负数移动多少位,高位就补多少个0。
例如:-15右移动两位 -15 >>> 2
这边是正数即位原码了,直接计算001111…1100得到结果:1073741820
4.与运算
说明:两个数的二进制相与都是1返回1,都是0返回0,不相同返回0
例如:-15&15
运算得到:1
5.或运算
有1则1
例如:-15|15
因为或运算得到的是负数再求原码得到:-1
6.亦或运算
说明:相同为0,不同为1
例如:-15^15
因为亦或运算后是负数再求原码得到:-2
7.取反运算
说明:包括符号位在内的1变0,0变1
因为取反后是负数再求得其原码得到:-16