一、问题
移位运算包括左移和右移,其功能是将参与运算的数据的各⼆进制位全部左移或者右移若⼲位。运算符“ << ”和“ >> ”都是双⽬运算符,运算符左侧为需要移位的数据,右侧为需要移动的位数。那么在移位过程中,如何补位呢?
二、解答
左移运算的功能是将“ << ”左边的运算数的各⼆进制位全部左移若⼲位,由“ << ”右边的数指定移动的位数。移位后,⾼位丢弃,低位补0。
例如 a=35 ,表⽰成⼆进制数形式为 00100011。那么 a<<3,就是将 a 的⼆进制数的各个⼆进制位都向左移 3 位,则移出的⾼ 3 位舍弃,即 001 舍弃,⽽低三位就会空出,⽤ 0 补位,结果为 00011000,转换成⼗进制数为 24 。
右移运算的功能是将“ >> ”左边的运算数的各⼆进制位全部右移若⼲位,由“ >> ”右边的数指定移动的位数。移位后,同样是⾼位丢弃,低位补 0 。
例如 a=9,表示成⼆进制数为 00001001。那么 a>>1,就是将 a 的⼆进制数的各个⼆进制位都向右移 1 位,则移出的低 1位舍弃,⽽⾼⼀位空出,⽤ 0 补位,结果为 00000100, 转换成⼗进制数为 4 。
在移位运算中应该注意的是,对于有符号数,在右移时符号位也随之移动,当运算数为正数时,最⾼位补 0 ;当运算数为负数时,符号位为 1 ,不同的编译系统补位不同,可能补 1 也可能补0。在 Turbo C 和很多系统中规定⾼位补 1 。
三、总结
补位是移位运算中的重点,要记住左移与右移的补位位置,以及正负数是补 0 还是补 1 。若不了解编译系统在负数右移时⾼位是补 0 还是 1 ,可以编写⼀个简单的移位程序来证明。