移位运算符的小技巧

移位符号

 * >>右移,补码移动,表示向右移动几位,正数高位补0,负数高位补1
 * <<左移,补码移动,无正负
 * >>>无符号右移,右移后高位补0,无正负
(1).判断二进制中1的个数

思路:
1.利用进制转的规则写出来算法
2.利用位运算,1,二进制只有一个1,不断移动二进制中一位置,然后做按位与,只有1&1=1,判断结果是否为0,即可
3.法2反向思考,挪动要判断的数字,然后与1做与运算
4.例如9=1001,8=1000,7=0111,9&8=8=1000,可以去掉一个1,8*7=0000,又去掉一个1
5.java可以利用封装的方法 Integer.bitCount( )

package 位运算;

import java.util.Scanner;

public class 二进制中1的个数 {
	public static void main(String[] args) {
		
		/*
		 * 思路一:利用进制转换法写出算法,判断
		 */
		
			int n=9;
			int m,k=0;
			while(n>0) {
			m=n%2;
			if(m==1)k++;
			n/=2;
			}
			System.out.println(k);
			System.out.println("==");
		
		/*
		 * 思路二:利用位运算,当1向左移动是,利用与运算,只有1&1=1,判断这一位是否有1
		 */
		
		int k1=0;
		for(int i=0;i<32;i++) {
			if(((1<<i)&9)!=0) 
				k1++;
		}
		System.out.println(k1);
		System.out.println("===");
		/*
		 * 思路三:不挪动1,挪动n,在判断
		 */
		int k2=0;
		for(int i=0;i<32;i++) {
			if(((9>>i)&1)!=0) 
				k2++;	
		}
		System.out.println(k2);
		System.out.println("====");
		/*
		 * 思路四:9=1001.8=1000;9&8=8=1000;去掉一个1了,最后判断减去多少个1
		 */
		int N=9,k3=0;
		while(N!=0) {
			N&=(N-1);
			k3++;
		}
		System.out.println(k2);
		System.out.println("=====");
		/*
		 * 思路四:利用封装的方法
		 */
		System.out.println(Integer.bitCount(9));
		System.out.println("======");
	}
}
(二)二进制中奇偶数字互换

思路:
利用位运算把奇数和偶数上的数字截取出来,比如9=1001,截取j,偶数位x=1000,奇数位y=0001,在分别移动位置,x右移,y左移,得到,0100,0010,然后按位或或者相加,得到0110

package 位运算;

import java.util.Scanner;

/*
	 * 思路一:
	 * 		把二进制放进数组中,然后遍历数组,两两交换,
	 * 与运算
	 * 1叫做保留,0是消除
	 */
public class 二进制奇偶互换 {
	public static void main(String[] args) {
		
		/*
		 * 思路:保留奇数位和偶数位的二进制数字,然后分别将其移动,偶数位左移,奇数位右移,然后相加
		 */
		Scanner sc=new Scanner(System.in);
		int N=sc.nextInt();
		int j1=N&0Xaaaaaaaa;//偶数位,jdk中允许16进制的书写,而且int型为32位,比较的二进制,写的哪一进制没有问题
		int j2=N&0x55555555;//奇数位
		System.out.println((j1>>1)^(j2<<1));
		/*
		 * 1.可以相加
		 * 2.按位或
		 * 3.按位异或
		 */
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值