首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C中的按位运算产生不需要的1或F。

C中的按位运算产生不需要的1或F。
EN

Stack Overflow用户
提问于 2022-05-30 12:31:59
回答 1查看 54关注 0票数 0

我对C的位运算有问题,不能将两个数字“合并”在一起。假设我的数字为0x0A (或任何两个十六进制数字),并且希望用0xF替换左数字,例如: 00001010 -> 11111010按位表示。

我想做的是:

  1. 我们通过左移位(sizeof of (Int)*8-4)删除2位十六进制数的左数字,从而留下我们关心的最右边的位,然后右移(无符号),这样我们最终只能得到正确的十六进制数字。在上面的例子中,这并不重要,因为它将产生与0x0A相同的'A‘。
  2. 第二步是“合并”我们在第一步中得到的数字和我们想要使用的移位十六进制数字,我们将使用一个OR门来实现这一点。

因此:

步骤1前后的十六进制数:移位后所需的十六进制数: F0 (11110000)或门:

00001010或11110000 = 11111010 = 0xFA

但是,出于某种原因,我的C代码正确地完成了上述所有操作,并且在应用OR时,它给出了0xFFFFFFA(8字节)的结果。

在C是如何按位工作的问题上,我缺少了什么吗?

请注意,我使用了sizeof( int ),因为代码应该能够解释4或8字节int。

谢谢你提前提供帮助!

代码语言:javascript
运行
复制
int setHexDigit(char* digitPairPtr, int digitPos, char hexDigit)
{
    int return_value = 0;
    if( (hexDigit>='0' && hexDigit<='9') || (hexDigit>='A' && hexDigit <='F'))
    {
        if(digitPos==0)
        {   
            hexDigit = ((hexDigit<='9' && hexDigit>='0') ? (hexDigit-'0') : ( (hexDigit>='A' && hexDigit<='F') ? (hexDigit-('A'-10)) : (-1))); //THIS LINE IS NOT IMPORTANT 
            *digitPairPtr = ((unsigned)*digitPairPtr<<((sizeof(int))*8-4))>>((sizeof(int))*8-4); //Drop left digit.
            hexDigit = (hexDigit << 4);
            *digitPairPtr = *digitPairPtr | hexDigit;
            return_value=1;
        }
        else
        {
            //For later
        }
    }
    return return_value;
}

int main()
{
    char c = 0x0A;
    setHexDigit(&c,0,'F');
    printf("\n%X", c);
    return 0;
}
EN

回答 1

Stack Overflow用户

发布于 2022-05-30 12:38:03

我认为问题在printf语句中。如果您使用的是char签名的编译器,则将c传递给printf将其从0xFA扩展到0xFFFFFFFA。尝试使用unsigned char代替。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72434399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档