Posts Rotate Bits (geeksforgeeks - SDE Sheet)
Post
Cancel

Rotate Bits (geeksforgeeks - SDE Sheet)

PROBLEM DESCRIPTION

Given an integer N and an integer D, rotate the binary representation of the integer N by D digits to the left as well as right and return the results in their decimal representation after each of the rotation. Note: Integer N is stored using 16 bits. i.e. 12 will be stored as 0000000000001100.

geeksforgeeks

SOLUTION

Good Explanation - geeksforgeeks

Left Shift:

If we left shift N by D places to the left, the left most D bits should move towards right. The trick is to get those left most D bit by right shifting N by (16-N) times! Then just taken a bitwise OR for both of them. We need to ensure that the final result is still in 16 bit, so we do a bitwise AND with (1<<16) - 1.

Similar process can be followed for right shift as well.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.util.ArrayList;

class Solution {

    // Method to rotate the bits of integer N by D positions to the left and right
    ArrayList<Integer> rotate(int N, int D) {

        // Create a list to store the results of the rotations
        ArrayList<Integer> list = new ArrayList<>();

        // Normalize D to ensure it's within the range of 0-15 for a 16-bit representation
        D = D % 16;

        // Left rotation
        // Shift N left by D positions
        int a = (N << D);
        // Shift N right by (16 - D) positions to capture the overflow bits
        int b = (N >> (16 - D));

        // Combine the two results using bitwise OR and ensure only the last 16 bits are kept
        int res = (a | b) & ((1 << 16) - 1);

        // Add the left-rotated result to the list
        list.add(res);

        // Right rotation
        // Shift N right by D positions
        a = (N >> D);
        // Shift N left by (16 - D) positions to capture the overflow bits
        b = (N << (16 - D));

        // Combine the two results using bitwise OR and ensure only the last 16 bits are kept
        res = (a | b) & ((1 << 16) - 1);

        // Add the right-rotated result to the list
        list.add(res);

        // Return the list containing both rotation results
        return list;
    }
}
This post is licensed under CC BY 4.0 by the author.