solution.md 894 字节
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1 2 3
# 消除尾一

下面的代码把一个整数的二进制表示的最右边的连续的1全部变成0  
每日一练社区's avatar
每日一练社区 已提交
4

每日一练社区's avatar
每日一练社区 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
如果最后一位是0,则原数字保持不变。  

**输入:**

```
00000000000000000000000001100111
```

**输出:**

```
00000000000000000000000001100000
```

**输入:**

```
00000000000000000000000000001100
```

**输出:**

```
00000000000000000000000000001100
```

请你填补空白处的内容:

每日一练社区's avatar
每日一练社区 已提交
33
```c
每日一练社区's avatar
每日一练社区 已提交
34 35 36 37 38 39 40 41
#include <stdio.h>

void f(int x)
{
    int i;
    for (i = 0; i < 32; i++)
        printf("%d", (x >> (31 - i)) & 1);
    printf("   ");
ToTensor's avatar
ToTensor 已提交
42
    __________________;
每日一练社区's avatar
每日一练社区 已提交
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    for (i = 0; i < 32; i++)
        printf("%d", (x >> (31 - i)) & 1);
    printf("\n");
}

int main()
{
    f(103);
    f(12);
    return 0;
}
```

## 答案

每日一练社区's avatar
每日一练社区 已提交
58
```c
每日一练社区's avatar
每日一练社区 已提交
59 60 61 62 63 64 65
x = x & (x + 1);
```

## 选项

### A

每日一练社区's avatar
每日一练社区 已提交
66
```c
每日一练社区's avatar
每日一练社区 已提交
67 68 69 70 71
x = x & (x - 1);
```

### B

每日一练社区's avatar
每日一练社区 已提交
72
```c
每日一练社区's avatar
每日一练社区 已提交
73 74 75 76 77
x = x && (x - 1);
```

### C

每日一练社区's avatar
每日一练社区 已提交
78
```c
每日一练社区's avatar
每日一练社区 已提交
79 80
x = x && (x + 1);
```