移位运算符的使用(位移运算法则)

Java移位运算符不外乎就这三种:<>(带符号右移)和>>>(无符号右移)。1、左移运算符左移运算符<<使指定值的所有位都左移规定的次数。1)它的通用格式如下所示:value<<numnum指定要移位值value移动的

Java移位运算符不外乎就这三种:<<(左移)、>>(带符号右移)和>>>(无符号右移)。

移位运算符的使用(位移运算法则)

1、左移运算符

左移运算符<<使指定值的所有位都左移规定的次数。

1)它的通用格式如下所示:

value<<num

num指定要移位值value移动的位数。

左移的规则只记住一点:丢弃最高位,0补最低位

如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位。

2)运算规则

按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。

当左移的运算数是int类型时,每移动1位它的第31位就要被移出并且丢弃;

当左移的运算数是long类型时,每移动1位它的第63位就要被移出并且丢弃。

当左移的运算数是byte和short类型时,将自动把这些类型扩大为int型。

3)数学意义

在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方

4)计算过程:

例如:3<<2(3为int型)

1)把3转换为二进制数字
00000000000000000000000000000011,

2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,

3)在低位(右侧)的两个空位补零。则得到的最终结果是
00000000000000000000000000001100,

转换为十进制是12。

移动的位数超过了该类型的最大位数,

如果移进高阶位(31或63位),那么该值将变为负值。下面的程序说明了这一点:

Java代码收藏代码

// Left shifting as a quick way to multiply by 2.

public class MultByTwo {

public static void main(String args[]) {

int i;

int num = 0xFFFFFFE;

for(i=0; i<4; i++) {

num = num << 1;

System.out.println(num);

}

}

} 123456789101112131415161718192021复制代码类型:[java]

该程序的输出如下所示:

536870908

1073741816

2147483632

-321234567复制代码类型:[java]

注:n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1)——2^(n-1)-1,所以模为2^(n-1)。

2、右移运算符

右移运算符<<使指定值的所有位都右移规定的次数。

1)它的通用格式如下所示:

value>>num

num指定要移位值value移动的位数。

右移的规则只记住一点:符号位不变,左边补上符号位

2)运算规则:

按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1

当右移的运算数是byte和short类型时,将自动把这些类型扩大为int型。

例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(signextension),在进行右移

操作时用来保持负数的符号。

3)数学意义

右移一位相当于除2,右移n位相当于除以2的n次方。

4)计算过程

11>>2(11为int型)

1)11的二进制形式为:
00000000000000000000000000001011

2)把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。

3)最终结果是
00000000000000000000000000000010。

转换为十进制是2。

35>>2(35为int型)

35转换为二进制:
00000000000000000000000000100011

把低位的最后两个数字移出:
00000000000000000000000000001000

转换为十进制:8

5)在右移时不保留符号的出来

右移后的值与0x0f进行按位与运算,这样可以舍弃任何的符号位扩展,以便得到的值可以作为定义数组的下标,从而得到对应数组元素代表的十六进制字符。

例如Java代码

(b >> 4) & 0x0f的运算过程:

b的二进制形式为:1111 0001

4位数字被移出:1111 1111

按位与运算:0000 1111

转为10进制形式为:15

b & 0x0f的运算过程:

b的二进制形式为:1111 0001

0x0f的二进制形式为:0000 1111

按位与运算:0000 0001

转为10进制形式为:112345678910111213141516171819复制代码类型:[java]

所以,该程序的输出如下:

b = 0xf11复制代码类型:[java]

3、无符号右移

无符号右移运算符>>>

它的通用格式如下所示:

value>>>num

num指定要移位值value移动的位数。

无符号右移的规则只记住一点:忽略了符号位扩展,0补最高位

无符号右移运算符>>>只是对32位和64位的值有意义

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/45635.html

(0)
nan
上一篇 2021-11-16
下一篇 2021-11-16

相关推荐

  • 经济日报期待滴滴重整出发(一退一上)

    12月3日早间,滴滴出行(以下简称滴滴)官微发布动态称,经认真研究,公司即日起启动在纽交所退市的工作,并启动在香港上市的准备工作。滴滴这“一退一上”消息成为这两天市场焦点。依我看,这是完全的市场行为,是滴滴管理层根据公司内部治理结构、纽交所股价表现、

    2021-12-04
    0
  • hario虹吸壶真假辨别(真假hario虹吸壶对比全攻略)

    有人说完美咖啡的灵魂要透过冲煮来引导出来,而V60滤杯确实可以做到这一点,凭什么它可以做到一支独秀?Hario以及V60滤杯发明者的故事,交织成一个大众喜爱的产品,延伸出更多咖啡的可能性。事实上,如果

    2022-01-09 创业分享
    0
  • 总结了一些小的心得分享给大家(怎样写产品文档模板?)

    最新在做一个新产品上线的准备,包含编写FAQ文档的工作,总结了一些小的心得分享给大家,希望做出一个简单的FAQ文档模版方便大家可以随时套用。这里首先推荐大家在做产品的时候,把产品所有相关的资料用文档保存,便于为之后的FAQ文档编写做素材积

    2021-12-03
    0
  • u盘安装系统的正确方法(u盘操作系统安装步骤)

    U盘安装系统是在电脑无法进入操作系统,出现黑屏蓝屏、系统故障等等有效的解决方法,很多小白用户还没有使用过这个方法,那么今天带你看下如何用U盘安装系统教程吧。U盘安装系统准备事项1、一个容量8G的品牌U盘,注意提前备份好U盘上重要资料2、

    2022-01-08 创业分享
    0
  • 对脑白金广告进行分析(脑白金广告内容概述)

    脑白金之所以人尽皆知,重复十多年不变的广告累积有很大的功劳。广告的知名度也需要一个积累的过程。广告长年出现在大众的视线里,久而久之也就记忆深刻了。从艾宾浩斯遗忘曲线也可以看出,重复越及时,记忆效果越好。虽然脑白金的广告已经听烦了,但

    2021-12-01
    0
  • windows10如何快速调节屏幕亮度(屏幕亮度调节快捷键)

    合适的显示器亮度对保护我们的眼睛有很重要的意义!那么平时对于显示器的亮度你是如何调节的呢?是通过显示器上面的实体按钮调节,还是通过Windows系统来调节呢?Windows10系统电脑虽然能够调节大多数显示器的背光,但它通常不支持外置

    2021-12-03 创业分享
    0

发表回复

登录后才能评论