搜尋
首頁後端開發php教程php使用位元運算實現整數的加減乘除並測試(程式碼範例)

這篇文章帶給大家的內容是關於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;  // 3
echo Arithmetic::minus(10, 3).PHP_EOL;  // 7
echo Arithmetic::multiple(5, 3).PHP_EOL;  // 15
echo Arithmetic::pide(-2147483648, 1).PHP_EOL;  // -2147483648
echo Arithmetic::pide(-15, 3).PHP_EOL;  // -5

相關推薦:

#PHP和html表單之間實作簡單互動的程式碼

php如何產生HTML檔案的類別? php產生html檔案類別的方法

以上是php使用位元運算實現整數的加減乘除並測試(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
1bit等于多少字节1bit等于多少字节Mar 09, 2023 pm 03:11 PM

1bit等于八分之一个字节。二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位;每8个位(bit,简写为b)组成一个字节(Byte),因此“1字节(Byte)=8位(bit)”。在多数的计算机系统中,一个字节是一个8位(bit)长的数据单位,大多数的计算机用一个字节表示一个字符、数字或其他字符。

如何使用redis的bit位操作如何使用redis的bit位操作May 26, 2023 pm 02:14 PM

本文redis试验代码基于如下环境:操作系统:MacOS64位版本:Redis5.0.764bit运行模式:standalonemoderedis位操作reids位操作也叫位数组操作、bitmap,它提供了SETBIT、GETBIT、BITCOUNT、BITTOP四个命令用于操作二进制位数组。先来看一波基本操作示例SETBIT语法:SETBITkeyoffsetvalue即:命令key偏移量0/1setbit命令用于写入位数组指定偏移量的二进制位设置值,偏移量从0开始计数,且只允许写入1或者0,

1byte等于多少bit1byte等于多少bitMar 19, 2021 pm 02:52 PM

1byte等于8bit。数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit)为单位,一个位就代表一个0或1(即二进制),每8个位(bit)组成一个字节(Byte),是最小一级的信息单位;因而,“1Byte=8bit”。

Linux中如何查看系统是32位还是64位?Linux中如何查看系统是32位还是64位?Mar 01, 2024 pm 07:34 PM

  CentOS是Linux的一种发行版,起源于RHEL,并按照开放源代码的规定释出源码进行编译。而且它与RHEL在功能上保持兼容性,是一个免费、开源的操作系统,用户可以在不支付版权费用的情况下使用并进行修改。那么Linux中CentOS区分32和64位吗?具体请看下文。  CentOS区分32位和64位!  主要区别:  CentOS32bit系统主要针对PC而发布的;  CentOS64bit系统主要针对大型的科学计算;  64bitLinux系统主要安装64bit硬件系统上;  32bit

1字节等于多少bit1字节等于多少bitMar 02, 2023 pm 03:44 PM

1字节等于8位(bit)。二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位;每8个位(bit,简写为b)组成一个字节(Byte),因此“1字节(Byte)=8位(bit)”。在多数的计算机系统中,一个字节是一个8位长的数据单位,大多数的计算机用一个字节表示一个字符、数字或其他字符。

Pi币是什么?哪里能交易?为何有人说它是诈 骗?Pi币有什么用?Pi币是什么?哪里能交易?为何有人说它是诈 骗?Pi币有什么用?Mar 04, 2025 am 07:33 AM

Pi币深度解析:机遇与挑战并存的加密货币Pi币(π),这款备受关注的加密货币,自2018年诞生以来,便以其独特的“手机挖矿”机制吸引了全球超过4700万用户。本文将深入探讨Pi币的基本信息、生态系统、应用场景以及围绕其产生的争议,帮助您全面了解这款备受争议的数字资产。Pi币核心信息中文名称:派币英文名称:Pi币、π币常用缩写:π官网:https://minepi.com/创始人:NicolasKokkalis(技术负责人,斯坦福大学博士)和Chengdiao

Linux C语言有bit吗Linux C语言有bit吗Mar 28, 2023 am 10:57 AM

Linux C语言有bit;在单片机C语言中,bit是新增的一个关键词,常用来定义一个“位变量” ;C语言定义bit型数据的方法是:1、通过sbit或者bit定义;2、通过位域(结构体中)定义;3、通过组合位运算符定义。

2025年十大虚拟货币交易平台:一目了然的选择2025年十大虚拟货币交易平台:一目了然的选择Feb 25, 2025 pm 12:12 PM

2025年十大虚拟货币交易平台:1、币安;2、OKX;3、gateio;4、bitget等等;在选择交易所时,建议您根据自身需求和偏好,综合考虑安全性、交易费用、用户体验等因素,选择最适合您的平台。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。