/*
int ans[
1000000];
int main(){
freopen(
"1.out",
"w", stdout);
int idc =
0;
long long n =
0xffff;
for(long long i=
1; i<n; i<<=
1){
if(n & i) ans[++idc] =
1;
else ans[++idc] =
0;
}
for(
int i=idc; i; i--){
printf(
"%d", ans[i]);
}
}
*/
int func(unsigned
int i)//
{
unsigned
int temp = i;
temp = (temp &
0x55555555) + ((temp>>
1) &
0x55555555);
//temp相邻位相加
0x55555555 =
1010101010101010101010101010101
temp = (temp &
0x33333333) + ((temp >>
2) &
0x33333333);
//temp相邻(以
2为单位)相加
0x33333333 =
110011001100110011001100110011
temp = (temp &
0x0f0f0f0f) + ((temp>>
4) &
0x0f0f0f0f);
//temp相邻(以
4为单位)相加
0x0f0f0f0f =
1111000011110000111100001111
temp = (temp &
0xff00ff) + ((temp>>
8) &
0xff00ff);
//temp相邻(以
8为单位)相加
0xff00ff =
111111110000000011111111
temp = (temp &
0xffff) + ((temp>>
16) &
0xffff) ;
//temp相邻(以
16为单位)相加
0xffff =
1111111111111111
return temp;
}
/*
先将n写成二进制形式,然后相邻位相加,重复这个过程,直到只剩下一位。
*/
膜大佬
转载请注明原文地址: https://www.6miu.com/read-28864.html