package com.java.ly2011.bczm;
/**
* 1 找一个数中二进制表示1的个数 6 =(0110)2 2个1
* 除了下面的3个方法外,还有一个经典的空间换时间的方法
* 即假设输入数字是8bit,就开辟一个0-255的数组 存储每个数包含多少个2进制的1 ,然后以后每次用的时候直接下标索引O(1)
* 2 两个正整数A、B 有多少位是不同的
*
* @author ly
*
*/
public class bitApp {
public static void main(String[] args) {
int a = 55; //0011 0111
System.out.println(MethodA1Num(a));
System.out.println(MethodB1Num(a));
System.out.println(MethodC1Num(a));
int A= 54;
int B =94;
System.out.println(bitApp.differentBitFromAandB(A, B));
}
/**
* 方法1 取余法 O(log2v)
* @param value
*/
public static int MethodA1Num(int value){
int num=0;
while(value!=0){
int a = value%2;
int b = value/2;
if(a==1)
num++;
value = b;
}
return num;
}
/**
* 整数v 的二进制有lg2v位 ,一位一位的比较,移位法 O(log2v)
* @param value
*/
public static int MethodB1Num(int value){
int num= 0;
while(value!=0){
int flag = value&1;
num+=flag;
value = value>>1; //value>>=1;
}
return num;
}
/**
* 整数v 的二进制表示有M的1
* 每次执行v=v&(v-1)就能让v减少一个1 执行多少次就是有多少个1 O(M)
* @param value
*/
public static int MethodC1Num(int value){
int num =0;
while(value!=0){
value&=(value-1);
num++;
}
return num;
}
/**
* A B的二进制表示,有多少位不一样
* @param A
* @param B
* @return
*/
public static int differentBitFromAandB(int A ,int B){
int C = A^B;//异或 不同的位全是1
int result = MethodB1Num(C);//数1的个数
return result;
}
}