学过c语言的朋友一定知道移位运算:>>右移,<<左移,把一个位表示的操作数以小数点位置为参照左右移动。>>右移k位,则丢弃最低的k为,左移k位最低的k位补0。
例如:
11111111 >> 4 = 00001111
11111111 << 4 = 111111110000
刚刚学习完c语言我也是这样理解的,前段时间看了《深入理解计算机系统》中,才看到逻辑右移和算术右移的分别,真是年少无知啊!!!
有一个相应的右移运算x>>k,按照我之前的理解是直接丢弃低k位,高位补0,但是,一般而言,机器是支持两种形式的右移:逻辑右移和算术右移。
简单来说,逻辑右移是在左端补0,而算术右移是在左端补最高位的有效值。
参数 x = [01100011]时:
x<<4 = [00110000]
x>>4(逻辑右移) = [00000110]
x>>4(算术右移) = [00000110]
x = [10010101]时:
x>>4(逻辑右移) = [00001001]
x>>4(算术右移) = [11111001]
c语言中对于无符号数据(unsigned),右移必须是逻辑的,对于有符号数,理论上都可以,但是 几乎所有的编译器/机器组合都对有符号数使用算术右移,所以程序员也一般默认使用算术右移。
java中对于如何右移有明确定义:
x>>k 算术右移k个位置
x>>>k 逻辑右移k个位置。