Search code examples
cbit-manipulationlow-level

How can I swap 2 integers in C using bitwise operators and bit manipulation?


I am having some trouble with swapping 2 integers using bit manipulation. Below is my code and console input/output.

#include <stdio.h>

int main() {
    int num1 = 0;
    int num2 = 0;
    int position = 1;

    scanf("%d", &num1);
    scanf("%d", &num2);

    for (int bitindex = 0; bitindex < 8; bitindex++) {
        printf("\nPosition: %d\n", position);
        printf("Number 1: %d\n", num1);
        printf("Number 2: %d\n", num2);
        if ((num1 & position) != (num2 & position)) {
            num1 ^= (num1 << bitindex);
            num2 ^= (num2 << bitindex);
        }
        if (bitindex == 0) {
            position++;
        }
        else {
            position *= 2;
        }
    }

    // printf("Number 1: %d\n", num1);
    // printf("Number 2: %d\n", num2);
}

Output:

4 7
Position: 1 Number 1: 4 Number 2: 7
Position: 2 Number 1: 0 Number 2: 0
Position: 4 Number 1: 0 Number 2: 0
Position: 8 Number 1: 0 Number 2: 0
Position: 16 Number 1: 0 Number 2: 0
Position: 32 Number 1: 0 Number 2: 0
Position: 64 Number 1: 0 Number 2: 0
Position: 128 Number 1: 0 Number 2: 0

I might be doing something completely wrong, I'm fairly new to low-level C programming. Is my algorithm inherently flawed? Is there a simpler way to do this? Any help and advice is welcome.


Solution

  • Is my algorithm inherently flawed?

    Yes. You need invert bit at certain position.

           num1 ^= position;
           num2 ^= position;
    

    1 * 2 is equal to 1 + 1. Just do position *= 2; each loop.

    int position = 1;
    for (int bitindex = 0; bitindex < 8; bitindex++) {
        if ((num1 & position) != (num2 & position)) {
           num1 ^= position;
           num2 ^= position;
        }
        position *= 2;
    }
    

    Is there a simpler way to do this?

    Yes, swap values with xor, as suggested in comments.