Logo

郎哥编程

移位赋值运算符

2019-12-07 1175

显示器显示的虽然是我们熟悉的十进制或字符,但在计算机存储器存储的数据都是以二进制形式存储的,程序输出时通过转换程序把二进制数据转换为十进制或字符输出到屏幕上。

二进制数是用0和1两个数字来表示的数,一个byte类型的数据占一个字节,是8位二进制数,一个int类型的数据占2个字节,是16位位二进制数。例如:字符A的十进制表示是65,二进制表示是01000001。位运算符就是针对二进制位进行操作,下表列出了位运算符“<< =、>>=”的描述及例子。

image.png


左移赋值运算符

左移赋值运算符用“<< =”表示,是将运算符左边操作数指定的变量值,向左移动运算符右边指定的位数,左侧移除的位全部丢弃,并且在低位补零后,再赋值给运算符左边操作数指定的变量。左移运算结果不能溢出,溢出后原来的数据信息会丢失。

溢出示例:字符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:在PbaseUnit6项目unit包下创建MoveLeftSample类。代码如下:

/** 
* @Title: MoveLeftSample.java 
* @Package unit 
* @Description: Java基础知识课程案例 
* @author 编程训练营 
* @date 2019年12月1日 
* @version V1.0 
*/ 
 
package unit;
 
/** 
* @ClassName: MoveLeftSample 
* @Description: 表达式与运算符(移位赋值运算符)案例1  
* @author 编程训练营 
* @date 2019年12月1日 
* 
*/
 
public class MoveLeftSample {
 
    /**
     * @Title: main
     * @Description: Java程序入口main方法
     * @param @param args 参数
     *
     * @return void 返回类型 @throws
     */
 
    public static void main(String[] args) {
       // 溢出左移运算符
       char a = 'A';
       // 将变量a左移2位
       a <<= 2;
       System.out.printf("a =%d\n", (int) a);
       // 未溢出左移运算
       char c = '1';
       // 将变量c左移1位
       c <<= 1;
       System.out.printf("c =%d\n", (int) c);
    }
 
}

代码结构分析

程序功能主要是演示复合赋值位运算符<<=的用法。

程序第一个左移运算是溢出运算示例,第二个左移运算是无溢出运算示例。

程序执行结果如下图所示:

image.png                                             

从上述结果可以看出,字符A的ASCII码值为65,左移2位,其高位1被移除,十进制数值为260,数值已超出了ASCII码值所能表示的范围,因此该左移运算无实际意义。数字1的ASCII码值为49,左移1位,其数值为98,其ASCII编码对应的字符为b,左移1位运算相当于将数字1的编码值进行了乘2操作。

案例2:在PbaseUnit6项目unit包下创建MoveRightSample类。代码如下:

/** 
* @Title: MoveRightSample.java 
* @Package unit 
* @Description: Java基础知识课程案例
* @author 编程训练营 
* @date 2019年12月1日 
* @version V1.0 
*/ 
 
package unit;
 
/** 
* @ClassName: MoveRightSample 
* @Description: 表达式与运算符(移位运算符)案例2
* @author 编程训练营 
* @date 2019年12月1日 
* 
*/
 
public class MoveRightSample {
 
    /**
     * @Title: main
     * @Description: Java程序入口main方法
     * @param @param args 参数
     *
     * @return void 返回类型
     * @throws
     */
 
    public static void main(String[] args) {
       // 右移运算符
       char a = 'A';
       System.out.printf("移位前:a =%d\n", (int) a);
       // 将变量a右移2位
       a >>= 2;
       System.out.printf("右移2位后:a =%d\n", (int) a);
    }
 
}

代码结构分析

程序功能主要是演示复合赋值位运算符>>=的用法。

语句“a >>= 2”,将变量a的值右移两位后,再赋值给变量a。

程序执行结果如下图所示:

image.png


从上述结果可以看出,变量a右移2位,相当于将变量a的值做除4操作,然后取整数。

移位运算的位是指二进制数位,移位操作也是针对二进制数操作,左移运算是将二进制数的每个二进制位都顺序左移,右边空出的位补0,左移运算不能移除为1的位,否则就会溢出,数据无意义。左移运算在无溢出的情况下,左移n位,就相当于乘上2 的n 次方。右移运算,右移n位,就相当于除上2 的n 次方。


代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论