java移位的具体应用

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)不用加减乘除,做加法

原文地址:https://www.cnblogs.com/wangxiaopei/p/8551257.html