Rumah >Java >javaTutorial >Bagaimana untuk melaksanakan penjumlahan dalam Java tanpa pengendali aritmetik
Soalannya mengatakan bahawa operator aritmetik tidak boleh digunakan, jadi kita hanya boleh bermula dengan operator logik dan operator shift.
Kita tahu bahawa operasi ^ (XOR) ialah jumlah bebas bawa bagi dua nombor Jika penambahan dua nombor tidak menghasilkan bawa, maka jumlahnya ialah hasil tambah dua nombor. Ini adalah kunci untuk menyelesaikan masalah. Secara amnya, menambah dua nombor akan menghasilkan bawaan Untuk mendapatkan jumlah yang betul, kita harus menambah bawa berdasarkan "jumlah tanpa bawa". Kita tahu bahawa apabila kedudukan yang sepadan bagi kedua-dua nombor adalah kedua-duanya 1, pembawaan akan berlaku Iaitu, di bawah syarat bahawa kedudukan yang sepadan A&B==1, kita boleh mendapatkan pembawa untuk setiap bit, tetapi pembawaan adalah untuk menambah. 1 ini kepada digit yang lebih tinggi yang sepadan, jadi kami mengalihkan bawa yang diperoleh ke kiri dengan satu digit, dan kemudian menambahnya pada "jumlah tanpa bawa" yang diperoleh sebelum ini, untuk mendapatkan jumlah dua nombor.
Kami mendapati bahawa kami boleh mempunyai anak patung matryoshka tak terhingga di sini Untuk mendapatkan jumlah "jumlah tanpa bawa" dan "bawaan terjana", kemudian anggap dua nombor ini sebagai dua nombor baharu. Operasi sebelumnya juga diulang sehingga dua nombor tidak dapat menghasilkan pembawa, dan hasilnya boleh diperolehi terus melalui operasi ^.
Andaikan kita dapati nilai 23 + 16
Mengikut idea di atas, kita boleh menulis dengan mudah kod
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); }
Jadi untuk mengesahkan ketepatannya, kami menggunakan logaritmik di sini untuk membandingkan fungsi dengan 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); }
Keputusan berjalan:
Hasil keluaran akhir adalah benar, yang bermaksud kami mengira nombor positif + nombor positif yang dijana secara rawak, nombor negatif + nombor negatif, nombor positif + Nombor negatif telah diuji 100000000 kali masing-masing, dan tiada ralat berlaku, menunjukkan bahawa fungsi itu boleh dipercayai.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan penjumlahan dalam Java tanpa pengendali aritmetik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!