Сложите два числа без знака, используя биты
Опубликовано: 30 Декабря, 2021
Даны два целых числа без знака (максимально возможный ввод может состоять из 32 бита). Задача состоит в том, чтобы сложить два числа с помощью битовых операций.
Примеры:
Ввод: n1 = 12, n2 = 34. Выход: 46 Ввод: n1 = 12564 n2 = -1 Выход: 12563
Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.
Подход: поскольку мы знаем, что дополнительно
- 1 + 0 = 1
- 0 + 1 = 1
- 0 + 0 = 0
- 1 + 1 = 0 переносить 1
- если (перенос == 1) 1 + 1 = 1 перенос 1
Представьте целое число с помощью функции набора битов в C ++. Он ведет себя как массив, который хранит LSB (наименьший значащий бит) в 0-м индексе, и когда мы печатаем такой массив, он печатает двоичное представление в обратном формате. Добавьте каждый бит справа в соответствии со свойством сложения битов и сохраните в третьем битовом наборе. Функция to_ulong () используется для преобразования битовой формы в десятичную.
Ниже представлена реализация описанного выше подхода.
C ++
#include <bits/stdc++.h> #define M 32 using namespace std; // Function to add two bitset int binAdd(bitset<M> atemp, bitset<M> btemp) { // To store the bits of answer bitset<M> ctemp; for ( int i = 0; i < M; i++) ctemp[i] = 0; // Initialize carry to 0 int carry = 0; for ( int i = 0; i < M; i++) { // Both bits are zero if (atemp[i] + btemp[i] == 0) { if (carry == 0) ctemp[i] = 0; else { ctemp[i] = 1; carry = 0; } } // Any of the one bit is 1 else if (atemp[i] + btemp[i] == 1) { if (carry == 0) ctemp[i] = 1; else { ctemp[i] = 0; } } // Both bits are 1 else { if (carry == 0) { ctemp[i] = 0; carry = 1; } else { ctemp[i] = 1; } } } // To convert bitset into // decimal equivalent return ctemp.to_ulong(); } // Driver Code int main() { int number1, number2; number1 = 12; number2 = 34; // Converting number 1 to bitset form bitset<M> num1(number1); // Converting number 2 to bitset form bitset<M> num2(number2); cout << binAdd(num1, num2) << endl; } |
Джава
// Java program to add two unsigned numbers using bits import java.util.*; // Needed for BitSet class. class GFG { static final int M = 32 ; // Function to add two BitSets. Returns long number. static long binAdd(BitSet atemp, BitSet btemp) { // Initialize a 3rd BitSet to store the answer. BitSet ctemp = new BitSet(M); for ( int i = 0 ; i < M; i++) { ctemp.set(i, false ); } // Initialize carry to ZERO. int carry = 0 ; for ( int i = 0 ; i < M; i++) { // Both of the bits are ZERO. if (atemp.get(i) == false && // Uses the "conditional-AND" operator // (also known as "short-circuit AND") // which is more efficient than the // ordinary & bitwise operator. btemp.get(i) == false ) { if (carry == 0 ) { ctemp.set(i, false ); } else { ctemp.set(i, true ); carry = 0 ; } } // Either of the bits is a ONE but not both. else if (atemp.get(i) == true ^ // Uses the "XOR" (exclusive-OR) // operator to ensure that ONLY // one of the two bits is a ONE. btemp.get(i) == true ) { if (carry == 0 ) { ctemp.set(i, true ); } else { ctemp.set(i, false ); } } // Both of the bits are ONE. else // By process of elimination we do not need // to code for the (TRUE & TRUE) condition. { if (carry == 0 ) { ctemp.set(i, false ); carry = 1 ; } else { ctemp.set(i, true ); } } } // Returns the 3rd BitSet as its decimal equivalent // number in long format. return ctemp.toLongArray()[ 0 ]; } // Driver Code public static void main(String args[]) { int number1, number2; // binary literal for decimal 15. number1 = 15 ; // binary literal for decimal 85. number2 = 1 ; // result should be decimal 100. // Converting number1 to BitSet form. BitSet num1 = BitSet.valueOf( new long [] { number1 }); // Converting number2 to BitSet form. BitSet num2 = BitSet.valueOf( new long [] { number2 }); System.out.printf( "%d plus %d equals %d" , number1, number2, binAdd(num1, num2)); System.out.println(); } } // This code is contributed by Arnab Kundu. // Modified by Matt Ambrose. |
Python3
# Python3 implementation of the approach # Function to convert given Integer # to list of bits of length M def bitset(num): return [ int (x) for x in format (num, '032b' )] # Function to add two bitset def binAdd(atemp, btemp): # To store the bits of answer ctemp = [ 0 ] * M # Initialize carry to 0 carry = 0 for i in range ( 0 , M): # Both bits are zero if atemp[i] + btemp[i] = = 0 : if carry = = 0 : ctemp[i] = 0 else : ctemp[i] = 1 carry = 0 # Any of the one bit is 1 elif atemp[i] + btemp[i] = = 1 : if carry = = 0 : ctemp[i] = 1 else : ctemp[i] = 0 # Both bits are 1 else : if carry = = 0 : ctemp[i] = 0 carry = 1 else : ctemp[i] = 1 # To convert bitset into string and then # convert string to its decimal equivalent temp = ''.join([ str (x) for x in ctemp]) return int (temp, 2 ) # Driver Code if __name__ = = "__main__" : number1, number2 = 12 , 34 M = 32 # Converting number 1 to bitset form num1 = bitset(number1) # Converting number 2 to bitset form num2 = bitset(number2) print (binAdd(num1, num2)) # This code is contributed by Rituraj Jain |
Выход
46
Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .