Reputation: 13
I'm trying to get my program to work where a certain bit is being flipped. I have this function called flipbit(int *p, int m)
. The user needs to input a digit and a bit number. Let's say the user gives the number 8
(00001000
) and the bit number 2
, so the 2nd bit in 8 should be flipped, which becomes 00001010
. How can I program this?
EDIT: I made a stupid mistake, I want to count starting from 0, so the 2nd bit in 8 flipped is actually 00001100
instead of 00001010
.
#include <stdio.h>
#include <stdlib.h>
void flipbit(int *p, int m) {
int digit;
digit = *p;
int bit;
bit = &m;
int result;
//printf("The numbers are %d %d", digit, bit);
printf("%d", result);
}
int main() {
int number1;
int number2;
printf("Give number and bit: ");
scanf("%d, %d",&number1, &number2);
flipbit(&number1, &number2);
return 0;
}
Upvotes: 0
Views: 1360
Reputation: 223699
Given the bit to flip, you first need to create a mask. Do that by taking the value 1
and left shifting it by the bit number.
Once you have that mask, use the bitwise XOR operator ^
to flip the bit.
int mask = 1 << m;
*p = *p ^ mask;
Upvotes: 3
Reputation: 1663
When checking your source code, there are mixture between pointer and value. To comply the call of your flipbit() function with the declaration, the call should be:
// first parameter is a pointer and second parameter is a value
flipbit(&number1, number2); // void flipbit(int *p, int m);
Inside the flipbit() function, the mixture continues because digit is a value and p is a pointer. The code should be:
int digit;
// 'digit' is a value and 'p' is a pointer
digit = p[0]; // 'digit' is the first value pointed by 'p'
Same error kind of error with the 'bit' parameter
int bit;
// 'bit' is a value and 'm' is a value
bit = m;
And the result to flip a bit is the XOR operation.
the bit number 2, so the 2nd
Due to your specification, you have to shift only of (bit - 1). So, in your case: 0x0001(or 0000.0000.0000.0001b) << (2 - 1) = 0x0002(or 0000.0000.0000.0010b)
result is 0x0010(or 0000.0000.0000.1000b) XOR 0x0002(or 0000.0000.0000.0010b) = 0x0012(or 0000.0000.0001.0010b).
int result;
result = digit ^ (0x0001 << (bit - 1));
Did you enter '9, 1' to comply with the scanf("%d, %d",..) ?
Upvotes: 0