solution.md 946 字节
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 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
```c
每日一练社区's avatar
每日一练社区 已提交
61 62 63 64 65

```

### after

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

```

## 答案

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

## 选项

### A

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

### B

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

### C

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