显示器显示的虽然是我们熟悉的十进制或字符,但在计算机存储器存储的数据都是以二进制形式存储的,程序输出时通过转换程序把二进制数据转换为十进制或字符输出到屏幕上。二进制数是用0和1两个数字来表示的数,一个byte类型的数据占一个字节,是8位二进制数,一个int类型的数据占2个字节,是16位位二进制数。例如:字符A的十进制表示是65,二进制表示是01000001。位运算符就是针对二进制位进行操作,下表列出了位运算符“<< =、>>=”的描述及例子。
左移赋值运算符
左移赋值运算符用“<< =”表示,是将运算符左边操作数指定的变量值,向左移动运算符右边指定的位数,左侧移除的位全部丢弃,并且在低位补零后,再赋值给运算符左边操作数指定的变量。左移运算结果不能溢出,溢出后原来的数据信息会丢失。
溢出示例:字符A的ASCII编码十进制数值为65,二进制编码是01000001,左侧第二位为1,如果左移2位,其值为00000100,其左侧的1被移除,运算结果溢出,移位后的数据无意义。因此,在左移运算过程中,只有为1的位没被移除,移位后的运算结果才有意义。
未溢出示例:数字1的ASCII编码为00110001,十进制数值为49,左移1位后,其值为01100010,十进制数值为98,其ASCII吗对应的字符为b。
从上个例子可以看出,在无溢出的情况下,数值向左移n 位,就相当于乘上2 的n 次方。
右移赋值运算符
右移赋值运算符用“〉〉 =”表示,是将运算符左边操作数指定的变量值,向右移动运算符右边指定的位数,右侧移除的位全部丢弃,左侧留出的空位补上符号位(正数为0,负数为1),再赋值给运算符左边操作数指定的变量。
例如:字符A的ASCII编码十进制数值为65,二进制编码是01000001,右移2位后,其值为00010000,十进制数值为16,如果右移8或更高位数,二进制编码为00000000,其数值为0,无实际意义。
示例1:左移赋值运算符
在D盘Java目录下,新建“MoveLeftSample.java”文件。用记事本打开“MoveLeftSample.java”文件,输入以下代码
代码结构分析
程序功能主要是演示复合赋值位运算符<<=的用法。
程序第一个左移运算是溢出运算示例,第二个左移运算是无溢出运算示例。
编译“MoveLeftSample.java”文件,在命令行窗口输入“javac MoveLeftSample.java”并执行命令,编译通过后,在命令行窗口输入“java MoveLeftSample”运行Java程序,命令行窗口显示如下信息:
图 6-7 左移赋值运算符示例执行结果
从上述结果可以看出,字符A的ASCII码值为65,左移2位,其高位1被移除,十进制数值为260,数值已超出了ASCII码值所能表示的范围,因此该左移运算无实际意义。数字1的ASCII码值为49,左移1位,其数值为98,其ASCII编码对应的字符为b,左移1位运算相当于将数字1的编码值进行了乘2操作。
示例2:右移赋值运算符
在D盘Java目录下,新建“MoveRightSample.java”文件。用记事本打开“MoveRightSample.java”文件,输入以下代码:
代码结构分析
程序功能主要是演示复合赋值位运算符>>=的用法。
语句“a >>= 2”,将变量a的值右移两位后,再赋值给变量a。
编译“MoveRightSample.java”文件,在命令行窗口输入“javac MoveRightSample.java”并执行命令,编译通过后,在命令行窗口输入“java MoveRightSample”运行Java程序,命令行窗口显示如下信息:
图 6-8 右移赋值运算符示例执行结果
从上述结果可以看出,变量a右移2位,相当于将变量a的值做除4操作,然后取整数。
移位运算的位是指二进制数位,移位操作也是针对二进制数操作,左移运算是将二进制数的每个二进制位都顺序左移,右边空出的位补0,左移运算不能移除为1的位,否则就会溢出,数据无意义。左移运算在无溢出的情况下,左移n位,就相当于乘上2 的n 次方。右移运算,右移n位,就相当于除上2 的n 次方。
(1)下列语句中,变量a左移2位后的结果是
int a =30;
a <<=2;
A .32
B .120
C .60
D .90
(2)下列语句中,变量右移2位后的结果是
int a =60;
a >>=2;
A .30
B .10
C .15
D .20
(3)一个变量的值是120,如果采用右移操作将变量值赋值为15,则需右移多少位
A.2
B.4
C.3
D.1