鱼C论坛

 找回密码
 立即注册
查看: 1888|回复: 1

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

[复制链接]
发表于 2019-3-3 16:41:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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),但是又不能用条件语句分类讨论。
最佳答案
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[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
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[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
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 10:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表