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