leetcode Hamming weight汉明权重计算

Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).

For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should return 3.

汉明权重指的是在一条字符串里 不同于’0‘字符的的这样的字符数目。

Hammingcode是指一个字串中非0符号的个数(TheHamming weight of a stringis the number of symbols that are different from the zero-symbol ofthealphabetused.)。应用到2进制符号序列中来,即二进制串中1的个数就是该串的Hammingcode.那么上述的问题即转换成求解字串的Hammingcode的问题。例如:


1.本来想利用自带的itoa()函数实现整数向二进制转换,没想到提交之后 implicit declaration of function ‘itoa’:

int hammingWeight(uint32_t n) {
    char c[33];
	memset(c,0,sizeof(c));
	itoa(n,c,2);
	int k=0;
	int l=strlen(c);
	for(int i=0;i<l;i++)
		if(c[i]=='1')k++;
	return k;
}

2.后来自定义一个itoa1()实现整数转换为二进制字符串,利用stack<int>容器承接,还是不行:‘stack’ undeclared (first use in this function)

void itoa1(uint32_t n,char *s){
	stack<int>ss;
	int i=0;
	do{ss.push(n%2);n=n/2;}while(n!=0);
	 while(!ss.empty())  
    {  
        s[i++]=ss.top()+'0';  
        ss.pop();  
    }  
	 s[i]='\0';
}
int hammingWeight(uint32_t n) {
    char c[33];
	memset(c,0,sizeof(c));
	itoa1(n,c);
	int k=0;
	int l=strlen(c);
	for(int i=0;i<l;i++)
		if(c[i]=='1')k++;
	return k;
}
3.最终:

void itoa1(uint32_t n,char *s){
	int i=0;
	do{s[i++]=(n%2)+'0';n=n/2;}while(n!=0);
	 s[i]='\0';
}
int hammingWeight(uint32_t n) {
    char c[33];
	memset(c,0,sizeof(c));
	itoa1(n,c);
	int k=0;
	int l=strlen(c);
	for(int i=0;i<l;i++)
		if(c[i]=='1')k++;
	return k;
}

4.输出反序后的整数:

void itoa1(uint32_t n,char *s){
	int i=0;
	do{s[i++]=(n%2)+'0';n=n/2;}while(n!=0);
	 s[i]='\0';
}
uint32_t reverseBits(uint32_t n) {
	char c[33]={'0'};
	itoa1(n,c);
	int l=strlen(c);
	if(l<33)
		{for(int i=l;i<32;i++)
			c[i]='0';
	c[32]='\0';}
	uint32_t sum=0;
	for(int i=0;i<32;i++)
	{ 
	  sum*=2;
	sum+=c[i]-'0';}
return sum;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值