#include "main.h"
/**
 * get_bit - returns the value of a bit at a given index
 * @n: the number
 * @index: the index of the bit we want to print
 * Return: value of the bit
 */
int get_bit(unsigned long int n, unsigned int index)
{
  int bit_value;
  if (index > 63)
    return (-1);
  bit_value = (n >> index) & 1;
  return (bit_value);
}
 
    
    - 81,885
- 6
- 58
- 85
 
    
    - 7
- 3
2 Answers
On your system unsigned long is a 64-bit value. The bit numbers (indexes) range from 0 - 63. If you are looking for an index greater-than 63 that is an error and -1 is returned. Otherwise, you shift the bits to the right (bits 0 - index - 1 fall off the right side (are shifted off)) leaving bits 63 - index. ANDing with 1 simply results in 1 or 0 depending on whether the bit at index is 1 or 0.
An Example
Let's take an example of the number 12 where bits at index 2 (the 4's bit) and 3 (the 8's bit) are both one (bits at indexes 4 - 63 are all 0, represented by .. below). You want to determine whether the bit at index 2 is 1 or 0 (on or off).
The binary representation of the number 12 is:
  ..1100
The index is 2. So shifting the value to the right by 2 (e.g. n >> index) results in the number 3, e.g.:
  ..0011
When you AND a number with 1 you are ANDing all bits with ..00000001 (showing only the final byte, all other bits are 0). The process of ANDing 3 and 1 is, and will result in:
  ..0011  AND
  ..0001
  ------
  ..0001
So in the number 12 the bit at index == 2 is 1. (if you try again with index == 1 or index == 4 the result is 0)
 
    
    - 81,885
- 6
- 58
- 85
It returns -1 for all positions greater than 64, that's the first if() check.
Then it right shifts the number by given index, and checks whether the bit is set or not.
shifted_number = bit >> index;
check = shifted_number & 1;
 
    
    - 5,438
- 2
- 27
- 32
- 
                    You are incorrect, no assignment to `n` is happening there. – Tanveer Badar Apr 29 '22 at 05:44
- 
                    You are incorrect. There are no modifications happening in `shifted_number & 1`. – Tanveer Badar Apr 29 '22 at 08:45
- 
                    You are again incorrect. `&` operator doesn't modify. There are no modifications happened in `shifted_number & 1`. – Tanveer Badar Apr 29 '22 at 17:57