wlchcarl 发表于 2019-3-3 16:41:42

使用位运算将一个二进制数的第n位置0或置1(不能用条件语句!)

要求用位运算(&,|,^,~,<<,>>)将一个二进制数的第n位置0或置1,并且不能使用任何循环(for,while等)和条件语句(if等)。
void set_bit (unsigned *x, unsigned n, unsigned v);
其中x是待修改的二进制数的指针,n是第n位(从右往左从0开始),v是0或者1,即要把第n位修改成v。

难点在于并不是单纯的取反或者是置0或者置1,可能有4种情况(把0置0,把0置1,把1置0,或者把1置1),但是又不能用条件语句分类讨论。

人造人 发表于 2019-3-3 16:58:10

#include <stdio.h>
#include <stdint.h>

uint32_t set_bit(uint32_t data, uint32_t index, uint32_t value)
{
        data &= ~(1 << index);
        data |= (value & 0x00000001) << index;
        return data;
}

char *get_bit_string(uint32_t data)
{
        static char string = {0};
        char *p = string;
        for(uint32_t mask = 0x80000000; mask; mask >>= 1)
        {
                if(mask & data)
                        *p++ = '1';
                else
                        *p++ = '0';
        }
        return string;
}

int main(void)
{
        for(uint32_t i = 0; i < 32; ++i)
                printf("%s\n", get_bit_string(set_bit(0, i, 1)));
        printf("\n");
        for(uint32_t i = 0; i < 32; ++i)
                printf("%s\n", get_bit_string(set_bit(0xffffffff, i, 0)));
        return 0;
}

00000000000000000000000000000001
00000000000000000000000000000010
00000000000000000000000000000100
00000000000000000000000000001000
00000000000000000000000000010000
00000000000000000000000000100000
00000000000000000000000001000000
00000000000000000000000010000000
00000000000000000000000100000000
00000000000000000000001000000000
00000000000000000000010000000000
00000000000000000000100000000000
00000000000000000001000000000000
00000000000000000010000000000000
00000000000000000100000000000000
00000000000000001000000000000000
00000000000000010000000000000000
00000000000000100000000000000000
00000000000001000000000000000000
00000000000010000000000000000000
00000000000100000000000000000000
00000000001000000000000000000000
00000000010000000000000000000000
00000000100000000000000000000000
00000001000000000000000000000000
00000010000000000000000000000000
00000100000000000000000000000000
00001000000000000000000000000000
00010000000000000000000000000000
00100000000000000000000000000000
01000000000000000000000000000000
10000000000000000000000000000000

11111111111111111111111111111110
11111111111111111111111111111101
11111111111111111111111111111011
11111111111111111111111111110111
11111111111111111111111111101111
11111111111111111111111111011111
11111111111111111111111110111111
11111111111111111111111101111111
11111111111111111111111011111111
11111111111111111111110111111111
11111111111111111111101111111111
11111111111111111111011111111111
11111111111111111110111111111111
11111111111111111101111111111111
11111111111111111011111111111111
11111111111111110111111111111111
11111111111111101111111111111111
11111111111111011111111111111111
11111111111110111111111111111111
11111111111101111111111111111111
11111111111011111111111111111111
11111111110111111111111111111111
11111111101111111111111111111111
11111111011111111111111111111111
11111110111111111111111111111111
11111101111111111111111111111111
11111011111111111111111111111111
11110111111111111111111111111111
11101111111111111111111111111111
11011111111111111111111111111111
10111111111111111111111111111111
01111111111111111111111111111111
请按任意键继续. . .
页: [1]
查看完整版本: 使用位运算将一个二进制数的第n位置0或置1(不能用条件语句!)