banner



How To Shift Bits From One Register To Another In Arm

Bitwise Operators in C/C++

In C, the post-obit 6 operators are bitwise operators (work at fleck-level)

Bitwise Operators in C/C++

  1. The & (bitwise AND) in C or C++ takes two numbers as operands and does AND on every flake of two numbers. The effect of AND is 1 only if both $.25 are i.
  2. The | (bitwise OR) in C or C++ takes two numbers as operands and does OR on every bit of two numbers. The result of OR is 1 if any of the 2 bits is 1.
  3. The ^ (bitwise XOR) in C or C++ takes two numbers every bit operands and does XOR on every bit of two numbers. The outcome of XOR is one if the two bits are dissimilar.
  4. The << (left shift) in C or C++ takes two numbers, left shifts the bits of the first operand, the second operand decides the number of places to shift.
  5. The >> (right shift) in C or C++ takes two numbers, right shifts the bits of the first operand, the second operand decides the number of places to shift.
  6. The ~ (bitwise Not) in C or C++ takes i number and inverts all bits of information technology

Instance:

C++

#include <iostream>

using namespace std;

int master() {

int a = 5, b = 9;

cout<< "a = " << a << "," << " b = " << b <<endl;

cout << "a & b = " << (a & b) << endl;

cout << "a | b = " << (a | b) << endl;

cout << "a ^ b = " << (a ^ b) << endl;

cout << "~(" << a << ") = " << (~a) << endl;

cout<< "b << i" << " = " << (b << 1) <<endl;

cout<< "b >> 1 " << "= " << (b >> i )<<endl;

return 0;

}

C

#include <stdio.h>

int principal()

{

unsigned char a = 5, b = nine;

printf ( "a = %d, b = %d\n" , a, b);

printf ( "a&b = %d\due north" , a & b);

printf ( "a|b = %d\n" , a | b);

printf ( "a^b = %d\northward" , a ^ b);

printf ( "~a = %d\n" , a = ~a);

printf ( "b<<1 = %d\n" , b << one);

printf ( "b>>one = %d\n" , b >> ane);

return 0;

}

Output:

a = 5, b = 9 a&b = one a|b = xiii a^b = 12 ~a = 250 b<<ane = 18 b>>1 = iv

Interesting facts near bitwise operators

  1. The left shift and right shift operators should not be used for negative numbers. If the second operand(which decides the number of shifts) is a negative number, information technology results in undefined behaviour in C. For example results of both 1 <<- i and i >> -1 is undefined. Also, if the number is shifted more than the size of the integer, the behaviour is undefined. For example, 1 << 33 is undefined if integers are stored using 32 bits. Another affair is, NO shift performance is performed if additive-expression(operand that decides no of shifts) is 0. See this for more details.
    Note: In C++, this beliefs is well-defined.
  2. The bitwise XOR operator is the most useful operator from a technical interview perspective. It is used in many problems. A simple example could exist "Given a set of numbers where all elements occur even a number of times except 1 number, observe the odd occurring number" This trouble tin can be efficiently solved by just doing XOR of all numbers.

C++

#include <iostream>

using namespace std;

int findOdd( int arr[], int n)

{

int res = 0, i;

for (i = 0; i < n; i++)

res ^= arr[i];

return res;

}

int main( void )

{

int arr[] = { 12, 12, 14, 90, 14, 14, fourteen };

int north = sizeof (arr) / sizeof (arr[0]);

cout << "The odd occurring element is  " << findOdd(arr, n);

return 0;

}

C

#include <stdio.h>

int findOdd( int arr[], int n)

{

int res = 0, i;

for (i = 0; i < due north; i++)

res ^= arr[i];

render res;

}

int chief( void )

{

int arr[] = { 12, 12, 14, 90, 14, 14, 14 };

int n = sizeof (arr) / sizeof (arr[0]);

printf ( "The odd occurring chemical element is %d " ,

findOdd(arr, due north));

return 0;

}

Output:

The odd occurring chemical element is 90
  1. The following are many other interesting problems using XOR operator.
    1. Find the Missing Number
    2. swap two numbers without using a temporary variable
    3. A Memory Efficient Doubly Linked List
    4. Find the ii not-repeating elements.
    5. Notice the two numbers with odd occurences in an unsorted-array.
    6. Add two numbers without using arithmetics operators.
    7. Bandy bits in a given number/.
    8. Count number of bits to be flipped to convert a to b .
    9. Find the element that appears once.
    10. Detect if two integers take opposite signs.
  2. The bitwise operators should not be used in place of logical operators. The outcome of logical operators (&&, || and !) is either 0 or 1, but bitwise operators render an integer value. As well, the logical operators consider whatsoever non-naught operand as 1. For example, consider the following programme, the results of & and && are dissimilar for same operands.

C++

#include <iostream>

using namespace std;

int main()

{

int x = ii, y = 5;

(x & y) ? cout << "Truthful " : cout << "Simulated " ;

(ten && y) ? cout << "True " : cout << "False " ;

return 0;

}

C

#include <stdio.h>

int main()

{

int x = ii, y = five;

(10 & y) ? printf ( "True " ) : printf ( "Faux " );

(x && y) ? printf ( "True " ) : printf ( "Imitation " );

return 0;

}

1.The left-shift and correct-shift operators are equivalent to multiplication and division by 2 respectively. As mentioned in point i, information technology works only if numbers are positive.

C++

#include <iostream>

using namespace std;

int main() {

int 10 = 19;

cout<< "ten << 1 = " << (x << 1) <<endl;

cout<< "10 >> 1 = " << (x >> 1) <<endl;

return 0;

}

C

#include <stdio.h>

int main()

{

int x = 19;

printf ( "ten << 1 = %d\north" , x << 1);

printf ( "x >> i = %d\n" , x >> i);

return 0;

}

Output:

x << i = 38 x >> 1 = 9

ii.The & operator can be used to quickly bank check if a number is odd or even. The value of expression (x & 1) would be non-zero only if x is odd, otherwise the value would be zero.

C++

#include <iostream>

using namespace std;

int principal() {

int x = 19 ;

(ten & 1) ? cout<< "Odd" : cout<< "Even" ;

render 0;

}

C

#include <stdio.h>

int main()

{

int x = xix;

(ten & ane) ? printf ( "Odd" ) : printf ( "Even" );

return 0;

}

three.The ~ operator should be used carefully. The effect of ~ operator on a small number can be a big number if the upshot is stored in an unsigned variable. And the outcome may be a negative number if the upshot is stored in a signed variable (assuming that the negative numbers are stored in 2's complement form where the leftmost scrap is the sign bit)

C++

#include <iostream>

using namespace std;

int chief() {

unsigned int x = 1;

signed int a = i;

cout<< "Signed Result " << ~a <<endl ;

cout<< "Unsigned Outcome " << ~10 ;

render 0;

}

C

#include <stdio.h>

int main()

{

unsigned int x = 1;

printf ( "Signed Result %d \n" , ~x);

printf ( "Unsigned Result %ud \northward" , ~x);

return 0;

}

Output:

Signed Result -ii  Unsigned Consequence 4294967294d
  1. Bits manipulation (Important tactics)
  2. Bitwise Hacks for Competitive Programming
  3. Scrap Tricks for Competitive Programming

Source: https://www.geeksforgeeks.org/bitwise-operators-in-c-cpp/

Posted by: mcdougalbaboyes.blogspot.com

0 Response to "How To Shift Bits From One Register To Another In Arm"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel