MechMK1
MechMK1

Reputation: 3388

C: Bitwise NOT on certain bit

My question is rather simple, yet I cannot find an easy solution: I have an integer greater or eqal 16, so at least 1000 in binary. I wish to flip the third bit using the bitwise NOT operator. In this case, it would be 1100.

Is there any operator which could do this? The ~-operator flips all bits as far as I know, not just one certain.

Upvotes: 4

Views: 889

Answers (5)

Sangeeth Saravanaraj
Sangeeth Saravanaraj

Reputation: 16627

#include <stdio.h>

int main(void)
{
    int x = 0xFFFFFFFF;
    int n = 0;
    int y, i;

    for (i=0 ; i < (int)sizeof(int)*8 ; i++) {
        y = x ^ ~(1<<i);
        printf("x=%x\ti=%d\ty=%x\n", x, i, y);
    }

    x = 0x0;
    for (i=0 ; i < (int)sizeof(int)*8 ; i++) {
        y = x ^ ~(1<<i);
        printf("x=%x\ti=%d\ty=%x\n", x, i, y);
    }
    return 0;
}

/*
Output:
x=ffffffff  i=0 y=1
x=ffffffff  i=1 y=2
x=ffffffff  i=2 y=4
x=ffffffff  i=3 y=8
x=ffffffff  i=4 y=10
x=ffffffff  i=5 y=20
x=ffffffff  i=6 y=40
x=ffffffff  i=7 y=80
x=ffffffff  i=8 y=100
x=ffffffff  i=9 y=200
x=ffffffff  i=10    y=400
x=ffffffff  i=11    y=800
x=ffffffff  i=12    y=1000
x=ffffffff  i=13    y=2000
x=ffffffff  i=14    y=4000
x=ffffffff  i=15    y=8000
x=ffffffff  i=16    y=10000
x=ffffffff  i=17    y=20000
x=ffffffff  i=18    y=40000
x=ffffffff  i=19    y=80000
x=ffffffff  i=20    y=100000
x=ffffffff  i=21    y=200000
x=ffffffff  i=22    y=400000
x=ffffffff  i=23    y=800000
x=ffffffff  i=24    y=1000000
x=ffffffff  i=25    y=2000000
x=ffffffff  i=26    y=4000000
x=ffffffff  i=27    y=8000000
x=ffffffff  i=28    y=10000000
x=ffffffff  i=29    y=20000000
x=ffffffff  i=30    y=40000000
x=ffffffff  i=31    y=80000000
x=0 i=0 y=fffffffe
x=0 i=1 y=fffffffd
x=0 i=2 y=fffffffb
x=0 i=3 y=fffffff7
x=0 i=4 y=ffffffef
x=0 i=5 y=ffffffdf
x=0 i=6 y=ffffffbf
x=0 i=7 y=ffffff7f
x=0 i=8 y=fffffeff
x=0 i=9 y=fffffdff
x=0 i=10    y=fffffbff
x=0 i=11    y=fffff7ff
x=0 i=12    y=ffffefff
x=0 i=13    y=ffffdfff
x=0 i=14    y=ffffbfff
x=0 i=15    y=ffff7fff
x=0 i=16    y=fffeffff
x=0 i=17    y=fffdffff
x=0 i=18    y=fffbffff
x=0 i=19    y=fff7ffff
x=0 i=20    y=ffefffff
x=0 i=21    y=ffdfffff
x=0 i=22    y=ffbfffff
x=0 i=23    y=ff7fffff
x=0 i=24    y=feffffff
x=0 i=25    y=fdffffff
x=0 i=26    y=fbffffff
x=0 i=27    y=f7ffffff
x=0 i=28    y=efffffff
x=0 i=29    y=dfffffff
x=0 i=30    y=bfffffff
x=0 i=31    y=7fffffff
*/

I refer this link for bit operations in c.

Upvotes: 1

Marnix v. R.
Marnix v. R.

Reputation: 1698

check this site: http://www.daniweb.com/software-development/c/threads/41493 he has the same problem you have, and a couple of solutions!

void flipbit(unsigned* a, unsigned b)
{
    *a ^= (1 << b);
}

Upvotes: 2

Tom Knapen
Tom Knapen

Reputation: 2277

Now what you call 'flip' is actually called XOR. XOR in C(++) works like this:

int sixteen = 16; // 10000
int twentyfour = sixteen ^ 0x8; // flip the 4th bit. result: 24
int sixteen_again = twentyfour ^ 0x8; // again, flip the 4th bit. result: 16

On a side note: 16 in binary is 10000, not 1000.

Upvotes: 3

Lie Ryan
Lie Ryan

Reputation: 64923

Do

bit_fld ^= (1 << n)

where bit_fld is the bit field, and n=3 for third bit.

Upvotes: 4

Sergey Kalinichenko
Sergey Kalinichenko

Reputation: 726987

XOR with the bits that you want to flip.

int c = 0x10; // 10000b
int m = 0x08; // 01000b
c ^= m;       // 11000b

Upvotes: 11

Related Questions