下面是一个程序,在该程序中我试图重置十六进制数字的特定位。位的位置,要重置的位数和十六进制值都是用户输入。

头文件

#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)来避免此问题。

10-08 05:08