一尘不染

计算下一个较高的数字,它具有相同的置位位数?

algorithm

geeksforgeeks网站上对此问题给出了解决方案。

我想知道是否存在更好和更简单的解决方案?这有点难以理解。只需一个算法就可以了。


阅读 212

收藏
2020-07-28

共1个答案

一尘不染

我敢肯定,该算法比链接的算法高效且易于理解。

此处的策略是要理解,在不增加数字1的情况下增大数字的唯一方法是携带1,但是如果携带多个1,则必须将其重新添加。

  • 给定一个数字 1001 1100

  • 右移它直到值是奇数0010 0111。记住班次:shifts = 2;

  • 右移它直到值等于0000 0100。记住执行的移位数和消耗的位。shifts += 3; bits = 3;

  • 到目前为止,我们从算法中提取了5个移位和3位,以携带可能的最低位数。现在我们还清。

  • 制作最右边的位1 0000 0101。我们现在欠它2位。bits -= 1

  • 向左移动3次以添加0。 0010 1000。我们做了三遍,因为shifts - bits == 3 shifts -= 3

  • 现在我们欠了两位数和两次移位。因此将其左移两次,每次将最左边的位设置为1。1010 0011。我们已经偿还了所有零钱和所有班次。bits -= 2; shifts -= 2; bits == 0; shifts == 0

这是其他一些示例…每个步骤都显示为 current_val, shifts_owed, bits_owed

0000 0110
0000 0110, 0, 0 # Start
0000 0011, 1, 0 # Shift right till odd
0000 0000, 3, 2 # Shift right till even
0000 0001, 3, 1 # Set LSB
0000 0100, 1, 1 # Shift left 0's
0000 1001, 0, 0 # Shift left 1's

0011 0011
0011 0011, 0, 0 # Start
0011 0011, 0, 0 # Shift right till odd
0000 1100, 2, 2 # Shift right till even
0000 1101, 2, 1 # Set LSB
0001 1010, 1, 1 # Shift left 0's
0011 0101, 0, 0 # Shift left 1's

2020-07-28