gpt4 book ai didi

c - 如何更改整数的 MSB

转载 作者:行者123 更新时间:2023-11-30 15:10:03 28 4
gpt4 key购买 nike

当我使用下面的代码更改 32 位时,或者当 bitc 等于 31 时,它给出 -2147483643。

它似乎将所有 0 更改为 1,而不是仅将最后一个 0 更改。我怎样才能在代码中解决这个问题?预先感谢您的帮助。

#include <stdio.h>

int main()
{
int num;
int newnum;
int orgnum;
int bitc;
int x;
int check;
printf("Enter the integer whose bits you want to manipulate. \n");
scanf("%d",&num);
orgnum=num;
printf("What bit would you like to change? 0 is the rightmost bit and 31 is the leftmost bit. \n");
scanf("%d",&bitc);
printf("Type in 1 to turn on the bit or 0 to turn of the bit. \n");
scanf("%d",&x);

check= (num>>bitc)&1;

if(x==1)
{
newnum=(num |= 1<<bitc);
}
else if(x==0)
{

if(check==0)
{
newnum=num;
}

else
{
newnum=(num &= ~(1<<x));
}

}

printf("Your orignal number was: ");
printf("%d", orgnum);
printf("\n");
printf("The new number after the bit manipulation is: ");
printf("%d",newnum);


//printf("%d //n|=1<<31;
//printf("%d", n);
//printf("%d", x);

return 0;
}

最佳答案

首先,正如已经提到的,当您写(1<<x)时你的意思是写(1<<bitc) .

您遇到的主要问题是您尝试在符号位上使用移位。对于 int ,最高有效位称为符号位,因为设置后意味着数字为负数。

现在,C 可以在广泛的系统上运行,并且历史上 CPU 以不同的方式实现负数。因此,C 标准没有定义移位 1 的操作。进出符号位。所以1 << 31原因undefined behaviour通过移动 1进入符号位。

此后还会出现其他问题,但为了简单起见,我不会详细介绍 - 所有这些问题都通过以下建议解决。

<小时/>

为了避免这些符号位问题,最简单、最好的选择是使用无符号类型。更改您的所有 num值来自intunsigned int ,并更改 1 <<1U <<在所有情况下。然后您可以像处理任何其他位一样处理最高有效位。

也可以使用%u而不是%d在 scanf 和 printf 中处理 unsigned int 时.

<小时/>

关于您的代码风格:

假设我们进行此更改以获得 newnum=(num |= 1U<<bitc); ,还是有点绕。 |=是复合赋值,因此您要更新 numnewnum 。但你只需要更新一个变量。事实上,你有 2 个冗余变量( orgnumcheck )和一些冗余测试。

将其与您的原始代码进行比较:

if(x==1)
newnum = num | (1U << bitc);
else
newnum = num & ~(1U << bitc);

您不必预先测试 0在未设置的情况下,因为它将设置 0无论如何(与您在设置的情况下没有预先测试 1 的原因相同)。

此外,最好检查用户输入是否在 unsigned int 的范围内。 。如果他们输入负数或大于 31 的数字 bitc你再次得到未定义的行为。

如果您在具有 64 位 int 或 16 位 int 的系统上运行代码会怎样?基本上你有两个选择:

  • 使用uint32_t而不是unsigned int ,以保证 32 位宽度(在这种情况下,再次检查 printf 说明符,如 David C Rankin 的答案所示;并使用 (uint32_t)1 而不是 1U )
  • 继续使用unsigned int然后使用表达式 CHAR_BIT * sizeof(int) - 1而不是31 .

关于c - 如何更改整数的 MSB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36415267/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com