移位符号
* >>右移,补码移动,表示向右移动几位,正数高位补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.按位异或 */ } }