1.符号:<<:左移,>>右移,>>>无符号右移
n<<1:n*2
n>>1:n/2
2.左移规则:向左移指定的位数,低位补零,高位舍弃多出的位数
举例:
1001<<1:00010010 1001<<2:00100100
00001010<<1:00010100
3.无符号右移规则:高位(左边)补零,低位(右边)舍弃指定的位数
1001>>1:00000100
4.有符号右移规则:正数:高位插零,负数:高位插一,低位(右边)舍弃指定的位数
正数:00001001>>1:00000100
负数:10001001>>1:11000100
10001001>>2:11100010
5.应用场合
<1>已知一个整数,求其二进制数中,1的个数。
常规思路:对每一位都依次与1&一下为0,则为0,为1则为1.
package day03;
/**
* @author wangpei
* @version
*创建时间:2017年2月7日 下午9:09:35
*输入十进制数,输出二进制数一的个数
*/
public class Exercise01 {
public static int getNumber(int x){
int count=0;
int flag=1;
while(flag!=0){
if((flag&x)!=0)
count++;
flag=flag<<1;
}
return count;
}
public static void main(String[] args) {
System.out.println(Exercise01.getNumber(8));
}
}
解释:用1左移不用x右移的原因,右移,当x为负数时,会出现一直做右移运算,陷入死循环。例如10000001>>1:11000000,会改变高位的值,一直在补1,而对于,正数,可以用移x.
(2)不用加减乘除,做加法