Bitwise AND of N binary strings
Last Updated :
10 Nov, 2022
Given an array arr[] of binary strings, the task is to calculate the bitwise AND of all of these strings and print the resultant string.
Examples:
Input: arr[] = {“101”, “110110”, “111”}
Output: 000100
Explanation: (000101) & (110110) & (000111) = 000100
Input: arr[] = {“110010101”, “111101001”}
Output: 110000001
Approach 1: Similar to Add two bit strings(https://www.geeksforgeeks.org/add-two-bit-strings/)
Given an array of N binary strings. We first compute the AND operation of the first two binary strings and then perform this “Result” with third binary string and so on till the last binary string.
For Example, string arr[] = {“101”, “110110”, “111”};
Step 1: Result = 101 AND 110110;
Step 2: Result = Result(Step1) AND 111;
So on..
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int makeEqualLength(string &a, string &b)
{
int len_a = a.length();
int len_b = b.length();
int num_zeros = abs (len_a-len_b);
if (len_a<len_b)
{
for ( int i = 0 ; i<num_zeros; i++)
{
a = '0' + a;
}
return len_b;
}
else
{
for ( int i = 0 ; i<num_zeros; i++)
{
b = '0' + b;
}
}
return len_a;
}
string andOperationBitwise(string s1, string s2)
{
int length = makeEqualLength(s1,s2);
string res = "" ;
for ( int i = 0 ; i<length; i++)
{
res = res + ( char )((s1[i] - '0' & s2[i]- '0' )+ '0' );
}
return res;
}
int main()
{
string arr[] = { "101" , "110110" , "111" };
int n = sizeof (arr)/ sizeof (arr[0]);
string result;
if (n<2)
{
cout<<arr[n-1]<<endl;
return 0;
}
result = arr[0];
for ( int i = 1; i<n; i++)
{
result = andOperationBitwise(result, arr[i]);
}
cout <<result<<endl;
}
|
Java
class GFG {
static String a;
static String b;
static int makeEqualLength()
{
int len_a = a.length();
int len_b = b.length();
int num_zeros = Math.abs(len_a - len_b);
if (len_a < len_b) {
for ( int i = 0 ; i < num_zeros; i++) {
a = '0' + a;
}
return len_b;
}
else {
for ( int i = 0 ; i < num_zeros; i++) {
b = '0' + b;
}
}
return len_a;
}
static String andOperationBitwise(String s1, String s2)
{
a = s1;
b = s2;
int length = makeEqualLength();
s1 = a;
s2 = b;
String res = "" ;
for ( int i = 0 ; i < length; i++) {
res = res
+ ( char )((s1.charAt(i) - '0'
& s2.charAt(i) - '0' )
+ '0' );
}
return res;
}
public static void main(String[] args)
{
String arr[] = { "101" , "110110" , "111" };
int n = arr.length;
String result = "" ;
if (n < 2 ) {
System.out.println(arr[n - 1 ]);
}
result = arr[ 0 ];
for ( int i = 1 ; i < n; i++) {
result = andOperationBitwise(result, arr[i]);
}
System.out.println(result);
}
}
|
Python3
def makeEqualLength(a, b):
len_a = len (a)
len_b = len (b)
num_zeros = abs (len_a - len_b)
if (len_a < len_b):
for i in range (num_zeros):
a = '0' + a
return len_b, a, b
else :
for i in range (num_zeros):
b = '0' + b
return len_a, a, b
def andOperationBitwise(s1, s2):
length, s1, s2 = makeEqualLength(s1, s2)
res = ""
for i in range (length):
res = res + str ( int (s1[i]) & int (s2[i]))
return res
arr = [ "101" , "110110" , "111" ]
n = len (arr)
if (n < 2 ):
print (arr[n - 1 ])
else :
result = arr[ 0 ]
for i in range (n):
result = andOperationBitwise(result, arr[i]);
print (result)
|
C#
using System;
class GFG {
static string a;
static string b;
static int makeEqualLength()
{
int len_a = a.Length;
int len_b = b.Length;
int num_zeros = Math.Abs(len_a - len_b);
if (len_a < len_b) {
for ( int i = 0; i < num_zeros; i++) {
a = '0' + a;
}
return len_b;
}
else {
for ( int i = 0; i < num_zeros; i++) {
b = '0' + b;
}
}
return len_a;
}
static string andOperationBitwise( string s1, string s2)
{
a = s1;
b = s2;
int length = makeEqualLength();
s1 = a;
s2 = b;
string res = "" ;
for ( int i = 0; i < length; i++) {
res = res
+ ( char )((s1[i] - '0' & s2[i] - '0' )
+ '0' );
}
return res;
}
public static void Main( string [] args)
{
string [] arr = { "101" , "110110" , "111" };
int n = arr.Length;
string result = "" ;
if (n < 2) {
Console.WriteLine(arr[n - 1]);
}
result = arr[0];
for ( int i = 1; i < n; i++) {
result = andOperationBitwise(result, arr[i]);
}
Console.WriteLine(result);
}
}
|
Javascript
<script>
let s1, s2;
function makeEqualLength()
{
let len_a = s1.length;
let len_b = s2.length;
let num_zeros = Math.abs(len_a - len_b);
if (len_a < len_b)
{
for (let i = 0; i < num_zeros; i++)
{
s1 = '0' + s1;
}
return len_b;
}
else
{
for (let i = 0; i < num_zeros; i++)
{
s2 = '0' + s2;
}
}
return len_a;
}
function andOperationBitwise()
{
let length = makeEqualLength();
let res = "" ;
for (let i = 0 ; i<length; i++)
{
res = res + String.fromCharCode((s1[i].charCodeAt() -
'0' .charCodeAt() &
s2[i].charCodeAt() -
'0' .charCodeAt()) +
'0' .charCodeAt());
}
return res;
}
let arr = [ "101" , "110110" , "111" ];
let n = arr.length;
let result;
if (n < 2)
{
document.write(arr[n - 1] + "</br>" );
}
result = arr[0];
for (let i = 1; i<n; i++)
{
s1 = result;
s2 = arr[i];
result = andOperationBitwise();
}
document.write(result);
</script>
|
Time Complexity: O(n *(length)), where n is the number of binary strings, and length is the length of the longest binary string.
Auxiliary Space: O(length), where length is the length of the longest binary string.
Approach 2: Find the size of the smallest and the largest string. We need this to add (largest-smallest) zeroes to our result. For example, if we have 0010 and 11, then AND on these strings will be 0010 (since we can write 11 as 0011). Then perform AND operation on each bit.
We can achieve this by only finding if the current bit in any string is 0 or not. If current bit is 0 in any of the given strings, then AND operation on that bit will be 0. If all bits at the current position are 1, then AND operation will be 1.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
string strBitwiseAND(string* arr, int n)
{
string res;
int smallest_size = INT_MAX;
int largest_size = INT_MIN;
for ( int i = 0; i < n; i++) {
reverse(arr[i].begin(), arr[i].end());
smallest_size = min(smallest_size, ( int )arr[i].size());
largest_size = max(largest_size, ( int )arr[i].size());
}
for ( int i = 0; i < smallest_size; i++) {
bool all_ones = true ;
for ( int j = 0; j < n; j++) {
if (arr[j][i] == '0' ) {
all_ones = false ;
break ;
}
}
res += (all_ones ? '1' : '0' );
}
for ( int i = 0; i < largest_size - smallest_size; i++)
res += '0' ;
reverse(res.begin(), res.end());
return res;
}
int main()
{
string arr[] = { "101" , "110110" , "111" };
int n = sizeof (arr) / sizeof (arr[0]);
cout << strBitwiseAND(arr, n);
return 0;
}
|
Java
class GfG
{
static String strBitwiseAND(String[] arr, int n)
{
String res = "" ;
int smallest_size = Integer.MAX_VALUE;
int largest_size = Integer.MIN_VALUE;
for ( int i = 0 ; i < n; i++)
{
StringBuilder temp = new StringBuilder();
temp.append(arr[i]);
arr[i] = temp.reverse().toString();
smallest_size = Math.min(smallest_size, arr[i].length());
largest_size = Math.max(largest_size, arr[i].length());
}
for ( int i = 0 ; i < smallest_size; i++)
{
boolean all_ones = true ;
for ( int j = 0 ; j < n; j++)
{
if (arr[j].charAt(i) == '0' )
{
all_ones = false ;
break ;
}
}
res += (all_ones ? '1' : '0' );
}
for ( int i = 0 ; i < largest_size - smallest_size; i++)
res += '0' ;
StringBuilder temp = new StringBuilder();
temp.append(res);
res = temp.reverse().toString();
return res;
}
public static void main(String []args)
{
String arr[] = { "101" , "110110" , "111" };
int n = arr.length;
System.out.println(strBitwiseAND(arr, n));
}
}
|
Python3
import sys;
def strBitwiseAND(arr, n) :
res = ""
smallest_size = sys.maxsize;
largest_size = - (sys.maxsize - 1 );
for i in range (n) :
arr[i] = arr[i][:: - 1 ] ;
smallest_size = min (smallest_size, len (arr[i]));
largest_size = max (largest_size, len (arr[i]));
for i in range (smallest_size) :
all_ones = True ;
for j in range (n) :
if (arr[j][i] = = '0' ) :
all_ones = False ;
break ;
if all_ones :
res + = '1' ;
else :
res + = '0' ;
for i in range (largest_size - smallest_size) :
res + = '0' ;
res = res[:: - 1 ];
return res;
if __name__ = = "__main__" :
arr = [ "101" , "110110" , "111" ];
n = len (arr) ;
print (strBitwiseAND(arr, n));
|
C#
using System;
class GfG
{
static String strBitwiseAND(String[] arr, int n)
{
String res = "" ;
int smallest_size = int .MaxValue;
int largest_size = int .MinValue;
String temp = "" ;
for ( int i = 0; i < n; i++)
{
temp+=arr[i];
arr[i] = reverse(temp);
smallest_size = Math.Min(smallest_size, arr[i].Length);
largest_size = Math.Max(largest_size, arr[i].Length);
}
for ( int i = 0; i < smallest_size; i++)
{
bool all_ones = true ;
for ( int j = 0; j < n; j++)
{
if (arr[j][i] == '0' )
{
all_ones = false ;
break ;
}
}
res += (all_ones ? '1' : '0' );
}
for ( int i = 0; i < largest_size - smallest_size; i++)
res += '0' ;
String temp1 = "" ;
temp1+=res;
res = reverse(temp1);
return res;
}
static String reverse(String input)
{
char [] temparray = input.ToCharArray();
int left, right = 0;
right = temparray.Length - 1;
for (left = 0; left < right; left++, right--)
{
char temp = temparray[left];
temparray[left] = temparray[right];
temparray[right] = temp;
}
return String.Join( "" ,temparray);
}
public static void Main(String []args)
{
String []arr = { "101" , "110110" , "111" };
int n = arr.Length;
Console.WriteLine(strBitwiseAND(arr, n));
}
}
|
Javascript
<script>
function strBitwiseAND(arr, n)
{
let res = "" ;
let smallest_size = Number.MAX_VALUE;
let largest_size = Number.MIN_VALUE;
let temp = "" ;
for (let i = 0; i < n; i++)
{
temp+=arr[i];
arr[i] = reverse(temp);
smallest_size = Math.min(smallest_size, arr[i].length);
largest_size = Math.max(largest_size, arr[i].length);
}
for (let i = 0; i < smallest_size; i++)
{
let all_ones = true ;
for (let j = 0; j < n; j++)
{
if (arr[j][i] == '0' )
{
all_ones = false ;
break ;
}
}
res += (all_ones ? '1' : '0' );
}
for (let i = 0; i < largest_size - smallest_size; i++)
res += '0 ';
// Reverse the string
// Since we started from LEFT to RIGHT
let temp1 = "";
temp1+=res;
res = reverse(temp1);
// Return the resultant string
let temparray1 = res;
let Temparray = "";
for(let i = 6; i < temparray1.length; i++)
{
Temparray = Temparray + temparray1[i];
}
return Temparray;
}
function reverse(input)
{
let temparray = input.split(' ');
let left, right = 0;
right = temparray.length - 1;
for (left = 0; left < right; left++, right--)
{
let temp = temparray[left];
temparray[left] = temparray[right];
temparray[right] = temp;
}
return temparray.join( "" );
}
let arr = [ "101" , "110110" , "111" ];
let n = arr.length;
document.write(strBitwiseAND(arr, n));
</script>
|
Time Complexity: O(max(n, length)), where n is the number of binary strings, and length is the length of the longest binary string
Auxiliary Space: O(length), where length is the length of the longest binary string
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...