solution.md 960 字节
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
```cpp
每日一练社区's avatar
每日一练社区 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#include <stdio.h>

void f(int x)
{
    int i;
    for (i = 0; i < 32; i++)
        printf("%d", (x >> (31 - i)) & 1);
    printf("   ");
    __________________
    for (i = 0; i < 32; i++)
        printf("%d", (x >> (31 - i)) & 1);
    printf("\n");
}

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

## aop

### before

每日一练社区's avatar
每日一练社区 已提交
60
```cpp
每日一练社区's avatar
每日一练社区 已提交
61 62 63 64 65

```

### after

每日一练社区's avatar
每日一练社区 已提交
66
```cpp
每日一练社区's avatar
每日一练社区 已提交
67 68 69 70 71

```

## 答案

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

## 选项

### A

每日一练社区's avatar
每日一练社区 已提交
80
```cpp
每日一练社区's avatar
每日一练社区 已提交
81 82 83 84 85
x = x & (x - 1);
```

### B

每日一练社区's avatar
每日一练社区 已提交
86
```cpp
每日一练社区's avatar
每日一练社区 已提交
87 88 89 90 91
x = x && (x - 1);
```

### C

每日一练社区's avatar
每日一练社区 已提交
92
```cpp
每日一练社区's avatar
每日一练社区 已提交
93 94
x = x && (x + 1);
```