1.统计二进制1个数
函数功能:统计一个字节数据二进制有几个1
实现方法:ch与1若不为0,计数器++,并右移一位进行下一位二进制数字判断
int GetBits1(unsigned char ch)//0010 1011->4;1000 0000->1
{
int count = 0;
while(ch != 0)
{
if((ch&1) != 0)
{
count++;
}
ch >>= 1;
}
return count;
}
2.统计二进制中1个数
函数功能:统计一个字节数据二进制有几个1
实现方法:ch &= (ch-1)//经典算法,使得每次丢弃最右边的1,没丢弃一次,计数器++
int GetBits2(unsigned char ch)
{
int count = 0;
while(ch != 0)
{
count++;
ch &= (ch-1);//丢弃二进制最右边的1
}
return count;
}
3.查表法(用空间换时间)
实现方法:将1-256每一个数字的二进制中1的个数列出,直接查找
优缺点:节省时间复杂度,但却要开辟一块数组,扩大了空间复杂度
int GetBits(unsigned char ch)
{
int bits[256] = {0,1,1,2,1,2,2,3,1};//....
return bits[ch];
}
4.不成对问题
函数功能:1个不成对的数据,找到他们
实现方法: tmp ^= arr[i],tmp依次与数组中每一个元素进行异或,最后留下的即为单独的数据
int NoOr(int *arr,int len)
{
int tmp = 0;
for(int i=0;i<len;i++)
{
tmp ^= arr[i];
}
return tmp;
}
5.B串是否在A串中
函数功能:返回bool值,来判断给定的字符串A和B(假设都是小写字母),
是否是B中的字符都存在于A中,如果是返回true,否则返回false
实现方法:对A中每个字母进行标记,假设a为0并统计出现次数,当B中元素标记为0的时候则表示B中元素在A中没有,返回false,否则返回true
bool checkString(const char *A,const char *B)
{
//arr作用统计A中的每个字母出现几次
int arr[26] = {0};//a,b,c,d...分别记录在0,1,2,3...下标; a->0; *A-'a'
while(*A != '\0')
{
arr[*A-'a']++;
A++;
}
while(*B != '\0' )
{
if(arr[*B-'a'] == 0)//A中没有该字符
{
return false;
}
B++;
}
return true;
}