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.
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.