求二进制中1的个数
时间:2006-06-04 来源:rwen2012
求二进制中1的个数
在新水木上看到的面试题。代码如下:
/* 代码一 */
#include <iostream> using namespace std; template <typename T>
size_t foo(T t)
{
size_t ret = 0;
while (t)
{
t &= t - 1;
++ret;
}
return ret;
} int main(void)
{
char a;
size_t sum;
a = 7;
sum = foo(a);
cout << sum <<endl;
return 0;
}
/* 代码二 */
#include <stdio.h>
unsigned int countbits(unsigned int x)
{
static unsigned int mask[]={0x55555555,
0x33333333,
0x0F0F0F0F,
0x00FF00FF,
0x0000FFFF};
int i;
int shift;/* number of positions to shift to right*/
for(i=0, shift=1; i<5; i++, shift*=2)
{
x=(x&mask[i])+((x>>shift)&mask[i]);
}
return x;
} int main(void)
{
unsigned int sum;
unsigned int a = 7;
sum = countbits(a);
printf("%d\n", sum);
return 0;
}
字符串转换整数
最近同学去不少公司面试,发现面试题都是大同小异,于是我决定将其记录下来,以备将来用。这个函数摘录于dietlibc,相对比较简单,而libc的太复杂,暂时没去学习。以下代码在VC6下调试通过。
#include <stdio.h> int atoi(const char* s) {
long int v=0;
int sign=1;
while ( *s == ' ' || (unsigned int)(*s - 9) < 5u) s++;
switch (*s) {
case '-': sign=-1;
case '+': ++s;
}
while ((unsigned int) (*s - '0') < 10u) {
v=v*10+*s-'0'; ++s;
}
return sign==-1?-v:v;
} int main()
{
char *p = " 1234";
int num; num = atoi(p); printf("%d\n", num); return 0; }
在新水木上看到的面试题。代码如下:
/* 代码一 */
#include <iostream> using namespace std; template <typename T>
size_t foo(T t)
{
size_t ret = 0;
while (t)
{
t &= t - 1;
++ret;
}
return ret;
} int main(void)
{
char a;
size_t sum;
a = 7;
sum = foo(a);
cout << sum <<endl;
return 0;
}
/* 代码二 */
#include <stdio.h>
unsigned int countbits(unsigned int x)
{
static unsigned int mask[]={0x55555555,
0x33333333,
0x0F0F0F0F,
0x00FF00FF,
0x0000FFFF};
int i;
int shift;/* number of positions to shift to right*/
for(i=0, shift=1; i<5; i++, shift*=2)
{
x=(x&mask[i])+((x>>shift)&mask[i]);
}
return x;
} int main(void)
{
unsigned int sum;
unsigned int a = 7;
sum = countbits(a);
printf("%d\n", sum);
return 0;
}
字符串转换整数
最近同学去不少公司面试,发现面试题都是大同小异,于是我决定将其记录下来,以备将来用。这个函数摘录于dietlibc,相对比较简单,而libc的太复杂,暂时没去学习。以下代码在VC6下调试通过。
#include <stdio.h> int atoi(const char* s) {
long int v=0;
int sign=1;
while ( *s == ' ' || (unsigned int)(*s - 9) < 5u) s++;
switch (*s) {
case '-': sign=-1;
case '+': ++s;
}
while ((unsigned int) (*s - '0') < 10u) {
v=v*10+*s-'0'; ++s;
}
return sign==-1?-v:v;
} int main()
{
char *p = " 1234";
int num; num = atoi(p); printf("%d\n", num); return 0; }
相关阅读 更多 +