在geeksforgeeks网站上对此问题给出了解决方案。
我想知道是否存在更好和更简单的解决方案?这有点难以理解。只需一个算法就可以了。
我敢肯定,该算法比链接的算法高效且易于理解。
此处的策略是要理解,在不增加数字1的情况下增大数字的唯一方法是携带1,但是如果携带多个1,则必须将其重新添加。
给定一个数字 1001 1100
1001 1100
右移它直到值是奇数0010 0111。记住班次:shifts = 2;
0010 0111
shifts = 2;
右移它直到值等于0000 0100。记住执行的移位数和消耗的位。shifts += 3; bits = 3;
0000 0100
shifts += 3; bits = 3;
到目前为止,我们从算法中提取了5个移位和3位,以携带可能的最低位数。现在我们还清。
制作最右边的位1 0000 0101。我们现在欠它2位。bits -= 1
0000 0101
bits -= 1
向左移动3次以添加0。 0010 1000。我们做了三遍,因为shifts - bits == 3 shifts -= 3
0010 1000
shifts - bits == 3
shifts -= 3
现在我们欠了两位数和两次移位。因此将其左移两次,每次将最左边的位设置为1。1010 0011。我们已经偿还了所有零钱和所有班次。bits -= 2; shifts -= 2; bits == 0; shifts == 0
1010 0011
bits -= 2; shifts -= 2; bits == 0; shifts == 0
这是其他一些示例…每个步骤都显示为 current_val, shifts_owed, bits_owed
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