下面是一个程序,在该程序中我试图重置十六进制数字的特定位。位的位置,要重置的位数和十六进制值都是用户输入。
头文件
#pragma once
int bit0(int i,unsigned int RegA,unsigned int RegB,int s[]);
C档
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "iostream"
#include "targetver.h"
#include "bit.h"
int bit0(int i,unsigned int RegA,unsigned int RegB,int s[])
{
unsigned int j=0;
unsigned int K=0;
unsigned int L=0;
printf("\nThe bit is at s[0] is %x\n", s[0]);
for (j=0; j<i; j++)
{
K = (1 << s[j]);
L = ~K;
RegB = RegA & ~L;
printf("\nThe bit is %x\n", RegB);
if (RegB | 0)
{
RegB = RegB & ~ (1 << s[j]);
}
else
{
RegB;
}
}
printf("\nThe new reset bit is %x\n", RegB);
_getch();
return 0;
}
主文件
#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "iostream"
#include "targetver.h"
#include "bit.h"
int main()
{
int i=0;
int j=0;
int s[35]={0};
unsigned int RegA = 0;
unsigned int RegB = 0;
printf("Enter the hexa decimal value to be reset ");
scanf_s("%x", &RegA);
printf("Entered hexa decimal value is %x ", RegA);
printf("\nHow many decimal places needs to be reset (0-31) ?");
scanf_s("%d", &i);
printf("Enter the decimal places that needs to be reset ");
for (j=0; j<i; j++)
{
scanf_s("%d", &s[j]);
}
///// check the entered hex value on those decimals places as bit 0 or bit 1
bit0(i,RegA,RegB,s);
_getch();
return 0;
}
我正在编译并使用Visual Studio运行上述代码。
问题出在C文件的
RegB = RegA & ~L;
行上。似乎没有进行AND操作,因为我得到的RegB
值为0。程序输入:
输入要重置的十六进制值:0100 1111
输入的十六进制值为:0100 1111
需要重设多少小数位(0-31):1
输入需要重置的小数位数:1
最佳答案
当然,您会得到0,但这是因为(全部)正在执行您编写的&
操作。这是代码的相关部分:
K = (1 << s[j]);
L = ~K;
RegB = RegA & ~L;
printf("\nThe bit is %x\n", RegB);
if (RegB | 0)
{
RegB = RegB & ~ (1 << s[j]);
}
else
{
RegB;
}
但是,在继续之前,有很多机会可以简化:
变量
L
对我来说使事情复杂化;我宁愿只看到~K
RegB | 0
等同于RegB
else
块什么都不做if
块可以安全地无条件执行,从某种意义上说,如果在给定条件为false时执行该块,则不会改变任何内容。尽管您已经设置了
K = (1 << s[j])
并且以后没有进行更改,但是您以后可以通过使用表达式(1 << s[j])
重复自己,而不仅仅是说K
。printf()
可能具有一些用于调试的实用程序,但它稍微模糊了计算的细节此等效代码将更易于推理:
K = (1 << s[j]);
RegB = RegA & K;
RegB = RegB & ~K;
到那时,问题应该很清楚了:无论
RegA
的值是什么,只要s[j]
在0到30之间,*您首先屏蔽掉某些RegB
即可计算RegA
'。 s位,然后掩盖其余位。自然,结果始终为0。*由于
1
是带符号的整数常量,如果实现的int
为32位宽,则左移31位会产生超出范围的结果。就该标准而言,结果行为是不确定的。最好通过使用无符号常量(即1U
)来避免此问题。