啊哈今天来做点恶心的事情,现在规定在运算的过程当中,不出现+ - * /等符号,实现位运算.
不使用操作符....嗯....我们马上能联想到把+ - * / 都写成函数不就OK了嘛.但是等一下,我们要做的是位运算唉,我们要操作的是1,0序列将+ - * /都写成函数固然可以,但是杀鸡怎么需要宰牛的刀捏?总所周知,我们的+ - * /都可以用万能的+法来表示 诸如a - b = a + (-b), a * b = a+a+a......(b个a) 除法就是用被除数不断的减去除数,能减多少次就是商....看到这里可能会有人禁不住想问,你这样减,减到最后减不完怎么办?(相当于有余数,要考虑小数) No problem因为我们做的是位运算...浮点数不在位运范围内,所以我们大可放心
然后也许有人又有问题了,如果只是用加法来实现 + - * / 那你循环调用加法的次数不是很多嘛? 对于这个回答,理论上确实是这样,但是实际上差别并不大,因为即便是long类型我们也只是有64位嘛,而我们操作的数都是二进制,那么那么嗯最坏的时候我们会循环(64-1)*2 = 126次,拿乘法来说,我们用一般的位移相乘的方法,极限情况下运算的次数是63次.那63次 与 126次的这一点差别看起来是一倍,实际上是非常小的而且实现起来很直观不用一下这个左移 那个右移,对于除法也一样,若是用加法来做的话,那么理论上极限情况就是2^63 / 1了 最多循环126次,而用先高位对齐,然后减,然后继续左移右移的方法 是63次
根据上面所叙述的,我们完全可用加法实现所有的 + - * /,效率不错而且很直观,又容易理解.下面是代码
若有错误欢迎指出哈~~