【问题标题】:Binary to unsigned int using bitwise operations and pointer arithmetic in C在 C 中使用按位运算和指针算术将二进制转换为无符号整数
【发布时间】:2012-07-03 21:04:27
【问题描述】:

我只能使用按位运算和指针运算来解决这个问题。我正在从二进制转换为无符号整数。

我写的函数是:

unsigned int atob(const char* nptr);

atob("101") 应该返回 5,atob("11000") 应该返回 24,atob("11$") 应该返回 3,atop("") 应该返回 0。

我对按位运算还很陌生,所以我真的需要一些专门针对该领域的帮助。

编辑:

nptr 只能递增,不允许其他 inc/dec。

【问题讨论】:

  • 你试过什么?这是作业吗?不允许使用比较吗?
  • 如果允许您使用*+,您将如何解决? (提示:*2 === <<1+ 可以在这里用| 完成。)
  • 这不是家庭作业。只是学习材料。从二进制转换为十进制我完全没有问题,但我对如何使用按位运算并不一致,因为我很少将它们用于任何事情。
  • atob("101") should return 3 我想你的意思是 5?

标签: c binary bit-manipulation


【解决方案1】:
unsigned bits2val(char *bits)
{
    unsigned val;

    for (val = 0; *bits; bits++) {
        if (*bits == '1') 
            val = (val << 1) | 1;
        else if (*bits == '0' ) 
            val <<= 1;
        else 
            break;
    }

    return val;
}

【讨论】:

  • 很难阅读,你介意清理一下帖子吗?
  • 你的代码格式有点不正常,我冒昧地对其进行了规范化。
  • 啊,你在讨论空格。我从不为单个语句使用额外的行。 (我仍然觉得我的更容易阅读。额外的行和大括号只会分散注意力,恕我直言)顺便说一句:通过纠正我的风格,你正在从人们那里获得机会去面对不同的 样式。
  • Wildplasser,这是真的,但在这里,我所拥有的风格是使用最广泛的风格。随意使用任何你想要的,只要确保你的缩进是正确的。 (另外,我确实给了你一个 +1)。
  • 我讨厌企业风格。在非公司环境中更是如此。请学习如何应对多样性,而不是将您的观点强加于他人。谢谢。
【解决方案2】:

这是我的示例实现,仅使用 shift 和 ors(假设您可以使用 ++ 进行字符串操作):

unsigned atob(const char *input)
{
    unsigned result = 0;
    unsigned currentBit = 0;

    // we need to go right to left;
    const char *end = input;
    // make sure we only read '0's and '1's
    while ((*end == '0') || (*end == '1'))
    {
        end++;
    }

    while (--end >= input) {
        // check for overflow
        if ((currentBit >> 3) > sizeof(result))
            break;

        char isCurrentBitSet = *end == '1';
        unsigned setValue = (isCurrentBitSet << currentBit);
        result |= setValue;

        currentBit++;
    }

    return result;
}

【讨论】:

  • 看起来不错,但我不能使用除法!这就是我挣扎的原因。
  • @JordanCarney 这只是为了检查溢出。如果您在编译时就知道unsigned 的大小,那不是问题。
  • 好的,我明白了。在这个练习中我实际上不需要检查溢出,所以没关系!
  • 还有一个问题:是否可以通过只增加 const char* 输入而不增加其他 inc/dec 来做到这一点?
【解决方案3】:
猜你喜欢
  • 2019-03-14
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 2021-02-14
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多