В мире вычислений, где информация и данные играют ключевую роль, работа с различными числовыми системами имеет фундаментальное значение. Одной из наиболее распространенных систем является двоичная система счисления, основанная на двух цифрах: 0 и 1. В этой системе числа представляются последовательностью битов, что делает ее идеальным инструментом для работы с цифровой информацией, включая компьютерные вычисления и хранение данных. В статье мы рассмотрим одну из базовых задач в двоичной системе — программу сложения двоичных чисел.
Теория
Двоичная система счисления — позиционная система счисления с основанием 2.
Числа записываются при помощи двух символов 0 и 1.
Правила сложения двоичных чисел:
1+1=2(10)=10(2), 1+1=10 0+1=1 и 1+0=1 0+0=0
Рассмотрим пример сложения двух двоичных чисел 1011 и 0011.
Как и при сложении десятичных чисел в столбик начинаем считать с последнего разряда.
1+1=2(10)=10(2)
Значит, записываем 0, а следующий разряд увеличивается на 1.
1+1+1(из предыдущего шага)=3(10)=11(2)
Записываем 1, а следующий разряд увеличивается на 1.
0+0+1(из предыдущего шага)=1
Записываем 1.
1+0=1
Записываем 1.
C++
Пример программы на C++, которая выполняет сложение двоичных чисел:
#include <iostream> #include <string> using namespace std; // Функция для сложения двух двоичных чисел в виде строк string binaryAddition(string binary1, string binary2) { int carry = 0; string result = ""; // Выравниваем двоичные числа по длине, добавляя в начало нули, если необходимо while (binary1.length() < binary2.length()) binary1 = "0" + binary1; while (binary2.length() < binary1.length()) binary2 = "0" + binary2; int length = binary1.length(); // Начинаем сложение с конца строк for (int i = length - 1; i >= 0; i--) { int bit1 = binary1[i] - '0'; int bit2 = binary2[i] - '0'; int sum = bit1 + bit2 + carry; // Если сумма равна 2 или 3, то устанавливаем перенос в 1 carry = sum / 2; // Добавляем бит суммы к результату result = char(sum % 2 + '0') + result; } // Если остался перенос, добавляем его к результату if (carry) result = "1" + result; return result; } int main() { string binary1, binary2; cout << "Введите первое двоичное число: "; cin >> binary1; cout << "Введите второе двоичное число: "; cin >> binary2; string sum = binaryAddition(binary1, binary2); cout << "Результат сложения: " << sum << endl; return 0; }
Эта программа позволяет пользователю ввести два двоичных числа в виде строк, затем выполняет их сложение и выводит результат на экран.
C#
using System; class BinaryAddition { static string AddBinaryStrings(string binary1, string binary2) { int maxLength = Math.Max(binary1.Length, binary2.Length); char[] result = new char[maxLength + 1]; // +1 for possible carry int carry = 0; for (int i = 0; i < maxLength; i++) { int bit1 = (i < binary1.Length) ? binary1[binary1.Length - 1 - i] - '0' : 0; int bit2 = (i < binary2.Length) ? binary2[binary2.Length - 1 - i] - '0' : 0; int sum = bit1 + bit2 + carry; result[maxLength - i] = (sum % 2).ToString()[0]; carry = sum / 2; } if (carry > 0) result[0] = '1'; return new string(result); } static void Main() { Console.Write("Введите первое двоичное число: "); string binary1 = Console.ReadLine(); Console.Write("Введите второе двоичное число: "); string binary2 = Console.ReadLine(); string sum = AddBinaryStrings(binary1, binary2); Console.WriteLine("Результат сложения: " + sum); } }
Python
def binary_addition(binary1, binary2): max_len = max(len(binary1), len(binary2)) binary1 = binary1.zfill(max_len) # Дополняем первое число нулями до максимальной длины binary2 = binary2.zfill(max_len) # Дополняем второе число нулями до максимальной длины carry = 0 result = [] for i in range(max_len - 1, -1, -1): bit1 = int(binary1[i]) bit2 = int(binary2[i]) # Вычисляем сумму текущих битов и переноса bit_sum = bit1 + bit2 + carry # Определяем текущий бит результата и обновляем перенос result.insert(0, str(bit_sum % 2)) carry = bit_sum // 2 if carry: result.insert(0, '1') return ''.join(result) # Ввод двоичных чисел от пользователя binary1 = input("Введите первое двоичное число: ") binary2 = input("Введите второе двоичное число: ") sum_binary = binary_addition(binary1, binary2) print("Результат сложения: " + sum_binary)
Java
import java.util.Scanner; public class BinaryAddition { public static String addBinary(String binary1, String binary2) { int maxLength = Math.max(binary1.length(), binary2.length()); StringBuilder result = new StringBuilder(); int carry = 0; // Дополняем двоичные числа нулями до одинаковой длины binary1 = String.format("%" + maxLength + "s", binary1).replace(' ', '0'); binary2 = String.format("%" + maxLength + "s", binary2).replace(' ', '0'); // Складываем биты справа налево for (int i = maxLength - 1; i >= 0; i--) { int bit1 = binary1.charAt(i) - '0'; int bit2 = binary2.charAt(i) - '0'; int sum = bit1 + bit2 + carry; result.insert(0, sum % 2); carry = sum / 2; } if (carry == 1) { result.insert(0, '1'); } return result.toString(); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Введите первое двоичное число: "); String binary1 = scanner.nextLine(); System.out.print("Введите второе двоичное число: "); String binary2 = scanner.nextLine(); String sum = addBinary(binary1, binary2); System.out.println("Результат сложения: " + sum); } }
Pascal
program BinaryAddition; var binary1, binary2, sum, result: string; carry, bit1, bit2, bitSum: integer; maxLength, i: integer; begin write('Введите первое двоичное число: '); readln(binary1); write('Введите второе двоичное число: '); readln(binary2); maxLength := max(length(binary1), length(binary2)); binary1 := copy('00000000000000000000000000000000', 1, maxLength - length(binary1)) + binary1; binary2 := copy('00000000000000000000000000000000', 1, maxLength - length(binary2)) + binary2; carry := 0; result := ''; for i := maxLength downto 1 do begin bit1 := ord(binary1[i]) - ord('0'); bit2 := ord(binary2[i]) - ord('0'); bitSum := bit1 + bit2 + carry; result := chr(bitSum mod 2 + ord('0')) + result; carry := bitSum div 2; end; if carry = 1 then result := '1' + result; writeln('Результат сложения: ', result); end.
обратите внимание, что в Pascal индексация символов начинается с 1, и мы используем ord для преобразования символов ‘0’ и ‘1’ в целые числа и chr для преобразования результата обратно в символы.
JavaScript
function addBinary(binary1, binary2) { const maxLength = Math.max(binary1.length, binary2.length); binary1 = binary1.padStart(maxLength, '0'); // Дополняем первое число нулями до максимальной длины binary2 = binary2.padStart(maxLength, '0'); // Дополняем второе число нулями до максимальной длины let carry = 0; let result = ''; for (let i = maxLength - 1; i >= 0; i--) { const bit1 = parseInt(binary1[i], 10); const bit2 = parseInt(binary2[i], 10); const sum = bit1 + bit2 + carry; result = (sum % 2) + result; carry = Math.floor(sum / 2); } if (carry > 0) { result = '1' + result; } return result; } const binary1 = prompt("Введите первое двоичное число: "); const binary2 = prompt("Введите второе двоичное число: "); const sum = addBinary(binary1, binary2); console.log("Результат сложения: " + sum);
PHP
<?php function addBinary($binary1, $binary2) { $maxLength = max(strlen($binary1), strlen($binary2)); $binary1 = str_pad($binary1, $maxLength, '0', STR_PAD_LEFT); // Дополняем первое число нулями до максимальной длины $binary2 = str_pad($binary2, $maxLength, '0', STR_PAD_LEFT); // Дополняем второе число нулями до максимальной длины $carry = 0; $result = ''; for ($i = $maxLength - 1; $i >= 0; $i--) { $bit1 = (int)$binary1[$i]; $bit2 = (int)$binary2[$i]; $sum = $bit1 + $bit2 + $carry; $result = ($sum % 2) . $result; $carry = (int)($sum / 2); } if ($carry > 0) { $result = '1' . $result; } return $result; } $binary1 = readline("Введите первое двоичное число: "); $binary2 = readline("Введите второе двоичное число: "); $sum = addBinary($binary1, $binary2); echo "Результат сложения: " . $sum . PHP_EOL; ?>