使用有限的按位运算符将无符号整数乘以10

时间:2014-03-01 22:04:59

标签: c bitwise-operators

这是关于练习考试的问题:

编写一个将参数乘以10的函数。您只能使用这些运算符:<< - & ^和唯一允许移位的常数是1 2 4 8 16.

函数原型是:

unsigned int(unsigned int x);

我们得到了一个解决方案,即:

unsigned int(unsigned int x) { 
    return (x << 4) - (x << 2) - (x << 1); 
} 

我知道它有效,并且它通过从整数中减去10的倍数来实现。我不明白为什么它有效,并想了解如何得出这个答案的过程。

提前感谢您的任何答案!

2 个答案:

答案 0 :(得分:9)

(x << 4)基本上是x * 16(x << 2)x * 4(x << 1)x * 2。因此,16x - 4x - 2x = 10x

至于为什么(x << 4)等于x * 16,这是因为二进制表示。让我们用二进制10(为清晰起见只显示8位;左边实际上有一堆更多的零):

00001010

现在让我们左移4个空格:

10100000

那是160。

一种思考方式是,当你在基数十(即10 - > 100)中加零时,你乘以10.当你在基数2中加零时,你乘以2因此,移动4个空格(因此增加4个零)乘以2*2*2*2 = 16

答案 1 :(得分:5)

x&lt;&lt; 1 = x * 2.

x&lt;&lt; 2 = x * 4.

x&lt;&lt; 4 = x * 16。

16 - 4 - 2 = 10。

您也可以使用:

x&lt;&lt; 3 = x * 8

但是8 + 2 = 10,所以你可以使用(x <&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 1&gt;