php使用位元運算實現整數的加減乘除並測試(程式碼範例)

來源:互聯網
上載者:User
本篇文章給大家帶來的內容是關於php使用位元運算實現整數的加減乘除並測試(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所協助。

<?php/** * Created by PhpStorm. * User: Mch * Date: 8/10/18 * Time: 23:51 * 只用位元運算不用算數運算實現整數的 + - * / */class Arithmetic {    const MAX_INTEGER = 2147483647;    const MIN_INTEGER = -2147483648;    /**     * @param int $a     * @param int $b     * @return int  $a + $b;     */    public static function add(int $a, int $b) : int {        $sum = $a;        while ($b) {            $sum = $a ^ $b;       // 不考慮進位            $b = ($a & $b) << 1;  //  只考慮進位            $a = $sum;        }        return $sum;    }    /**     * 相反數 <= 二進位表達取反+1(補碼)     * @param int $n     * @return int     */    private static function negateNumber(int $n) : int {        return self::add(~$n, 1);    }    /**     * a-b = a + (-b)     * @param int $a     * @param int $b     * @return int     */    public static function minus(int $a, int $b) : int {        return self::add($a, self::negateNumber($b));    }    /**     * @param int $a     * @param int $b     * @return int  $a * $b     */    public static function multiple(int $a, int $b) : int {        $res = 0;        while ($b) {            if (($b & 1)) {                $res = self::add($res, $a);            }            $a <<= 1;            $b >>= 1;        }        return $res;    }    private static function isNegative(int $n) : bool {        return $n < 0;    }    /**     * a/b  a = MIN_INTEGER, b!=MIN_INTEGER ?     * @param int $a     * @param int $b     * @return int     */    private static function p(int $a, int $b) : int {        $x = self::isNegative($a) ? self::negateNumber($a) : $a;        $y = self::isNegative($b) ? self::negateNumber($b) : $b;        $res = 0;        for ($i = 31; $i >-1; $i = self::minus($i, 1)) {            if (($x >> $i)>=$y) {                $res |= (1 << $i);                $x = self::minus($x, $y<<$i);            }        }        return self::isNegative($a) ^ self::isNegative($b) ? self::negateNumber($res):$res;    }    /**     * @param int $a     * @param int $b     * @return int $a / $b     */    public static function pide(int $a, int $b) : int {        if ($b === 0) {            throw new RuntimeException("pisor is 0");        }        if ($a === self::MIN_INTEGER && $b === self::MIN_INTEGER) {            return 1;        } else if ($b === self::MIN_INTEGER) {            return 0;        } else if ($a === self::MIN_INTEGER) {            $res = self::p(self::add($a, 1), $b);            return self::add($res, self::p(self::minus($a, self::multiple($res, $b)), $b));        } else {            return self::p($a, $b);        }    }}

TEST:

echo Arithmetic::add(1, 2).PHP_EOL;  // 3echo Arithmetic::minus(10, 3).PHP_EOL;  // 7echo Arithmetic::multiple(5, 3).PHP_EOL;  // 15echo Arithmetic::pide(-2147483648, 1).PHP_EOL;  // -2147483648echo Arithmetic::pide(-15, 3).PHP_EOL;  // -5
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.