How do you randomly zero a bit in an integer?

后端 未结 13 2071
無奈伤痛
無奈伤痛 2021-02-05 10:11

Updated with newer answer and better test

Let\'s say I have the number 382 which is 101111110.

How could I randomly turn a bit which is not 0 to

13条回答
  •  旧时难觅i
    2021-02-05 10:42

    EDIT : fixed to take into account the constraint "a bit which is not 0"

    Pick a random number N between 0 and 31 (for a 32 bit integer), and use it to generate a bitmask by shifting 1 N times to the left. Repeat until bit N is not 0 in the original number. Negate the bitmask to have only 1 bit set to 0 and combine it with your original number with the & operator :

    private int ClearOneBit(int originalValue)
    {
        if (originalValue == 0)
            return 0; // All bits are already set to 0, nothing to do
    
        Random rnd = new Random();
        int mask = 0;
        do
        {
            int n = rnd.Next(32);
            mask = 1 << n;
        } while ((mask & originalValue) == 0); // check that this bit is not 0
    
        int newValue = originalValue & ~mask; // clear this bit
        return newValue;
    }
    

提交回复
热议问题