|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
要求用位运算(&,|,^,~,<<,>>)将一个二进制数的第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),但是又不能用条件语句分类讨论。
- #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[33] = {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
- 请按任意键继续. . .
复制代码
|
|