其实java 移位运算的问题并不复杂,但是又很多的朋友都不太了解java移位运算符详解,因此呢,今天小编就来为大家分享java 移位运算的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
在Java编程中,移位运算是一个强大的工具,它允许我们以位级别的精度对数值进行操作。对于初学者来说,移位运算可能有些难以理解,但一旦掌握了它,你将发现它可以帮助你编写更加高效和精巧的代码。本文将深入探讨Java中的移位运算,包括左移、右移、无符号右移和位与、位或、位非等操作。
什么是移位运算?
在计算机中,所有数据都是以二进制的形式存储的。移位运算就是将二进制位按照指定的方向移动一定的位数。根据移动的方向,移位运算可以分为以下几种:
- 左移(<<):将操作数的二进制位向左移动指定的位数。
- 右移(>>):将操作数的二进制位向右移动指定的位数。
- 无符号右移(>>>):将操作数的二进制位向右移动指定的位数,并将最高位填充为0。
- 位与(&):将两个操作数的二进制位进行逐位比较,只有当两个位都为1时,结果位才为1。
- 位或(|):将两个操作数的二进制位进行逐位比较,只要有一个位为1,结果位就为1。
- 位非(~):将操作数的二进制位取反,即将1变为0,将0变为1。
左移(<<)
左移运算符(<<)将操作数的二进制位向左移动指定的位数。例如,将数字10(二进制为1010)左移2位,结果为40(二进制为100000)。
| 原始值 | 左移1位 | 左移2位 |
|---|---|---|
| 1010 | 0100 | 1000 |
右移(>>)
右移运算符(>>)将操作数的二进制位向右移动指定的位数。例如,将数字10(二进制为1010)右移2位,结果为2(二进制为0010)。
| 原始值 | 右移1位 | 右移2位 |
|---|---|---|
| 1010 | 0101 | 0010 |
无符号右移(>>>)
无符号右移运算符(>>>)与右移运算符类似,但不同之处在于它会将最高位填充为0。例如,将数字-10(二进制为1111111111111010)无符号右移2位,结果为-3(二进制为1111111111111111 11111111 11111110)。
| 原始值 | 无符号右移1位 | 无符号右移2位 |
|---|---|---|
| 1111111111111010 | 11111111111111111111111111111010 | 11111111111111111111111111111110 |
位与(&)
位与运算符(&)将两个操作数的二进制位进行逐位比较,只有当两个位都为1时,结果位才为1。例如,将数字10(二进制为1010)和数字12(二进制为1100)进行位与运算,结果为8(二进制为1000)。
| 操作数1 | 操作数2 | 位与结果 |
|---|---|---|
| 1010 | 1100 | 1000 |
位或(|)
位或运算符(|)将两个操作数的二进制位进行逐位比较,只要有一个位为1,结果位就为1。例如,将数字10(二进制为1010)和数字12(二进制为1100)进行位或运算,结果为14(二进制为1110)。
| 操作数1 | 操作数2 | 位或结果 |
|---|---|---|
| 1010 | 1100 | 1110 |
位非(~)
位非运算符(~)将操作数的二进制位取反,即将1变为0,将0变为1。例如,将数字10(二进制为1010)进行位非运算,结果为-11(二进制为1111111111110101)。
| 原始值 | 位非结果 |
|---|---|
| 1010 | 1111111111110101 |
应用场景
移位运算在Java编程中有着广泛的应用场景,以下是一些常见的应用:
- 位掩码:使用位与和位或运算符来设置或清除特定位的值。
- 数据压缩:通过移位运算将数据压缩到更小的空间。
- 位操作算法:例如,快速幂算法、查找算法等。
总结
Java移位运算是一种强大的位操作工具,可以帮助我们以位级别的精度对数值进行操作。通过理解并掌握移位运算的原理和应用场景,我们可以编写更加高效和精巧的代码。希望本文能帮助你更好地理解Java移位运算的秘密武器。
java位移运算符
学习Java本来就是一件日积月累的事情,或许你通过自学能掌握一些皮毛技术,通过Java学习机构学到Java的一些基本大面,但想要做到精通,还是需要自己技术的日积月累和工作经验的不断积累。
今天给大家分享的技术知识是:Java中的位移运算符!
1)“有符号”左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。
左移移位相当于乘以2,例如
3<< 2//12则是将数字3左移2位 3*2*2= 3*(2的2次方)
分析:首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12.数学意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
2)“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。
>>运算规则:按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补符号位,移位后得到的数字为正数则补0,负数补1。
例如11>> 2,则是将数字11右移2位
分析:11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010.转换为十进制是3.数学意义:右移一位相当于除2,右移n位相当于除以2的n次方。
3) Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0
4)右移一位相当于除以2,左移一位(在不溢出的情况下)相当于乘以2;移位运算速度高于乘除运算。
5)位运算符的优先级
~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|。
java中 << 什么意思比如1<<30,谢谢哦~~
是位移运算服,<<左移运算,>>右移运算,还有不带符号的位移运算>>>.
左移的运算规则:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
计算过程已1<<30为例,首先把1转为二进制数字0000 0000 0000 0000 0000 0000 0000 0001
然后将上面的二进制数字向左移动30位后面补0得到0010 0000 0000 0000 0000 0000 0000 0000
最后将得到的二进制数字转回对应类型的十进制
程序运行结果
另外两种的运算规则为
>>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1.
>>>运算规则:按二进制形式把所有的数字向右移动对应巍峨位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同
JAVA位运算怎么用的
Java位运算Java位运算[转]一,Java位运算1.表示方法: 在Java语言中,二进制数使用补码表示,最高位为符号位,正数的符号位为0,负数为1。补码的表示需要满足如下要求。 (l)正数的最高位为0,其余各位代表数值本身(二进制数)。 (2)对于负数,通过对该数绝对值的补码按位取反,再对整个数加1。2.位运算符 位运算表达式由操作数和位运算符组成,实现对整数类型的二进制数进行位运算。位运算符可以分为逻辑运算符(包括~、&、|和^)及移位运算符(包括>>、<<和>>>)。1)左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。2)“有符号”右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。3)Java也添加了一种“无符号”右移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。
public class Test3{
public static void main(String[] args)
{
int i=4;
System.out.println(~i);//-5(i的二进制为0100
System.out.println(~i&i);//0
System.out.println(~i|i);//-1
System.out.println(i>>2);//1
System.out.println(i<<2);//16
System.out.println(i>>>2);//1
System.out.println(-i>>2);//-1
System.out.println(-i>>>2);//1073741823
}
}
关于java 移位运算的内容到此结束,希望对大家有所帮助。




