我如何在这个代码挑战中理解这个测试用例的结果?



我正在尝试理解codeforces中这个挑战的第一个测试用例。

说明如下:

Sergey正在测试下一代处理器。处理器处理的不是字节,而是由n位组成的存储单元。这些位的编号从1到n。整数在单元格中的存储方式如下:最低有效位存储在单元格的第一位,下一个有效位存储在第二位,依此类推;最高有效位存储在第n位。现在Sergey想测试下面的指令:在单元格的值上加1。作为该指令的结果,写入单元格的整数必须加1;如果结果数的一些最高有效位不适合单元格,则必须丢弃它们。谢尔盖在单元格中写入了比特的某些值,并将在其值上加1。这个细胞的多少位在手术后会改变?

给定一个二进制数,在其十进制值上加1,计算运算后改变了多少位?

测试点
4

1100

= 34

1111
= 4

在第一个样本中,单元格的值为0010,在第二个样本中,单元格的值为0000。

在2的测试用例中1111是15,所以15 + 1 = 16(二进制10000),所以所有1的变化,因此是4

但是在2测试用例1100是12,所以12 + 1 = 13(01101),这里只是左边的1在最后改变,但结果是3为什么?

您错过了关键的部分:最低有效位是第一个(即最左边的那个),而不是最后一个,因为我们通常写二进制。

因此,1100不是12而是3。因此,1100 + 1 = 3 + 1 = 4 = 0010,所以改变了3位。

"最低有效位"字面上是指不是最高有效的位,所以你可以把它理解为"代表最小值的位"。在二进制中,表示2^0的位是最低有效的。因此,您的任务中的二进制代码编写如下:

bit no. 0    1    2    3    4   (...)
value   2^0  2^1  2^2  2^3  2^4 (...)
        | least             | most
        | significant       | significant
        | bit               | bit

这就是为什么1100是:

1100 = 1 * 2^0 + 1 * 2^1 + 0*2^2 + 0*2^3 = 1 + 2 + 0 + 0 = 3

相关内容

最新更新