Heim Java javaLernprogramm So implementieren Sie die Summierung in Java ohne arithmetische Operatoren

So implementieren Sie die Summierung in Java ohne arithmetische Operatoren

May 02, 2023 am 11:34 AM
java

So implementieren Sie die Summierung in Java ohne arithmetische Operatoren

Die Frage besagt, dass arithmetische Operatoren nicht verwendet werden können, sodass wir nur mit logischen Operatoren und Schiebeoperatoren beginnen können.

Wir wissen, dass die ^ (XOR)-Operation eine übertragsfreie Summe zweier Zahlen ist. Wenn die Addition zweier Zahlen keinen Übertrag ergibt, dann ist die Summe die Summe der beiden Zahlen. Dies ist der Schlüssel zur Lösung des Problems. Im Allgemeinen ergibt die Addition zweier Zahlen einen Übertrag. Um die richtige Summe zu erhalten, sollten wir einen Übertrag auf der Grundlage der „Summe ohne Übertrag“ addieren. Wir wissen, dass ein Übertrag auftritt, wenn die entsprechenden Positionen der beiden Zahlen 1 sind. Das heißt, unter der Bedingung, dass die entsprechenden Positionen A und B == 1 sind, können wir für jedes Bit einen Übertrag erhalten, aber der Übertrag muss addiert werden diese 1 auf die entsprechende höhere Ziffer, also verschieben wir den erhaltenen Übertrag um eine Ziffer nach links und addieren ihn dann zur zuvor erhaltenen „Summe ohne Übertrag“, um die Summe der beiden Zahlen zu erhalten.

Wir haben festgestellt, dass wir hier unendlich viele Matroschka-Puppen haben können, um die Summe aus „Summe ohne Übertrag“ und „erzeugter Übertrag“ zu erhalten. Die vorherige Operation wird ebenfalls wiederholt, bis die beiden Zahlen keinen Übertrag mehr erzeugen können und das Ergebnis direkt durch die ^-Operation erhalten werden kann.

Angenommen, wir finden den Wert von 23 + 16

So implementieren Sie die Summierung in Java ohne arithmetische Operatoren

So implementieren Sie die Summierung in Java ohne arithmetische Operatoren

Entsprechend Zur obigen Idee können wir den Code einfach schreiben

public static int addAB(int A, int B) {
		// 当两数的产生的进位为 0,就退出循环,返回其无进位和,就是结果
        while ((A & B) != 0) {
            int A_B = A ^ B;// 无进位求和
            int AB = (A & B) << 1;// 得到进位
            // 接下来就是求 得到的进位 + 无进位之和,重复前面的操作,直到不产生进位
            A = A_B;
            B = AB;
        }
        // 最后返回新的无进位之和
        return (A ^ B);
    }
Nach dem Login kopieren

Um seine Richtigkeit zu überprüfen, verwenden wir hier einen Logarithmierer, um die Funktion mit dem Operator ’

public static void main(String[] args) {
    int count = 1_0000_0000;// 比较次数 100000000次
    Random random = new Random();// 生成随机数字
    boolean flag = true;// 相等则为 true

    for (int i = 0; i < count; i++) {
        int num1 = random.nextInt(Integer.MAX_VALUE/2);// 随机正数1
        int num1_2 = random.nextInt(Integer.MAX_VALUE/2);// 随机正数2
        // 随机正数1 + 随机正数2
        if ((num1+num1_2) != addAB(num1,num1_2)){
            // 有一次不相等的,则退出循环
            flag = false;
            break;
        }

        int num2 = -random.nextInt(Integer.MAX_VALUE/2);// 随机负数1
        int num2_2 = -random.nextInt(Integer.MAX_VALUE/2);// 随机负数2
        // 随机负数1  + 随机负数2
        if ((num2+num2_2) != addAB(num2,num2_2)){
            // 有一次不相等的,则退出循环
            flag = false;
            break;
        }

        int num3 = random.nextInt(Integer.MAX_VALUE);// 随机正数
        int num4 = -random.nextInt(Integer.MAX_VALUE);// 随机负数
        // 随机正数  + 随机负数
        if ((num3+num4) != addAB(num3,num4)){
            // 有一次不相等的,则退出循环
            flag = false;
            break;
        }
    }
    System.out.println(flag);
}
Nach dem Login kopieren

Laufergebnis:

So implementieren Sie die Summierung in Java ohne arithmetische Operatoren

Das endgültige Ausgabeergebnis ist wahr, was darauf hinweist, dass wir zufällig generierte positive Zahlen + positive Zahlen berechnen , Negative Zahlen + negative Zahlen und positive Zahlen + negative Zahlen wurden jeweils 100.000.000 Mal ohne Fehler wiederholt, was darauf hinweist, dass die Funktion zuverlässig ist.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Summierung in Java ohne arithmetische Operatoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Quadratwurzel in Java Quadratwurzel in Java Aug 30, 2024 pm 04:26 PM

Quadratwurzel in Java

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Perfekte Zahl in Java

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Zufallszahlengenerator in Java

Armstrong-Zahl in Java Armstrong-Zahl in Java Aug 30, 2024 pm 04:26 PM

Armstrong-Zahl in Java

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Weka in Java

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Smith-Nummer in Java

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

Fragen zum Java Spring-Interview

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Brechen oder aus Java 8 Stream foreach zurückkehren?

See all articles