我正在尝试理解codeforces中这个挑战的第一个测试用例。
说明如下:
Sergey正在测试下一代处理器。处理器处理的不是字节,而是由n位组成的存储单元。这些位的编号从1到n。整数在单元格中的存储方式如下:最低有效位存储在单元格的第一位,下一个有效位存储在第二位,依此类推;最高有效位存储在第n位。现在Sergey想测试下面的指令:在单元格的值上加1。作为该指令的结果,写入单元格的整数必须加1;如果结果数的一些最高有效位不适合单元格,则必须丢弃它们。谢尔盖在单元格中写入了比特的某些值,并将在其值上加1。这个细胞的多少位在手术后会改变?
给定一个二进制数,在其十进制值上加1,计算运算后改变了多少位?
测试点41100
= 341111
= 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