# 按要求排序数组

<p>&nbsp;给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中，数字 1 的数目升序排序。 如果存在多个数字二进制中 1 的数目相同，则必须将它们按照数值大小升序排列。请你返回排序后的数组。</p>

以下程序实现了这一功能，请你补全空白处内容：

```cpp
#include<stdio.h>
#include<stdlib.h>
int oneNum(int x)
{
	int cnt = 0;
	while(x)
	{
		____________;
	}
	return cnt;
}
int cmp(const void *a,const void*b)
{
	int al,bl;
	int ret;
	al = *(int*)a;
	bl = *(int*)b;
	ret =  oneNum(al) - oneNum(bl);
	return  ret ? ret : al - bl;
}
int main()
{
	int s[]={1,2,3,5,6,7,8},i;
	int len = sizeof(s)/sizeof(*s);
	qsort(s,len,4,cmp);
	for(i = 0 ; i < len ; i++)
	{
		printf("%d\n",s[i]);
	}
}
```

## template

```cpp
#include<stdio.h>
#include<stdlib.h>
int oneNum(int x)
{
	int cnt = 0;
	while(x)
	{
		cnt++;
		x = x&(x-1);
	}
	return cnt;
}
int cmp(const void *a,const void*b)
{
	int al,bl;
	int ret;
	al = *(int*)a;
	bl = *(int*)b;
	ret =  oneNum(al) - oneNum(bl);
	return  ret ? ret : al - bl;
}
int main()
{
	int s[]={1,2,3,5,6,7,8},i;
	int len = sizeof(s)/sizeof(*s);
	qsort(s,len,4,cmp);
	for(i = 0 ; i < len ; i++)
	{
		printf("%d\n",s[i]);
	}
}
```

## 答案

```cpp
cnt++;
x = x & (x - 1);
```

## 选项

### A

```cpp
cnt++;
x = x | (x - 1);
```

### B

```cpp
cnt++;
x = x & (x + 1);
```

### C

```cpp
cnt++;
x = x & x - 1;
```