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

时间:2015-07-20 20:17:15

标签: algorithm bits

我试图理解代码中challenge的第一个测试用例。

描述如下:

  

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

摘要

给定二进制数,将十进制值加1,计算操作后改变了多少位?

测试用例

  

4

     

1100
  = 3

     

4

     

1111
  = 4

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

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

但是在2测试案例中1100是12,所以12 + 1 = 13(01101),这里只剩下左边1的变化,但结果是3为什么?

1 个答案:

答案 0 :(得分:2)

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

因此,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

不是反过来(正如我们经常写的那样)。