加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

这个反转位顺序功能怎么了?

发布时间:2020-12-16 10:39:34 所属栏目:百科 来源:网络整理
导读:我很惭愧地承认我不太了解比特和位操作,因为我可能应该这样做.我本周末尝试通过写一些“反转位数”和“计数ON位”功能来解决这个问题.我从 here开始做了一个例子,但是当我按照下面的方式实现它时,我发现我必须在 29.如果我在 32(如例子中所示)然后当我尝试打
我很惭愧地承认我不太了解比特和位操作,因为我可能应该这样做.我本周末尝试通过写一些“反转位数”和“计数ON位”功能来解决这个问题.我从 here开始做了一个例子,但是当我按照下面的方式实现它时,我发现我必须在< 29.如果我在< 32(如例子中所示)然后当我尝试打印整数(使用我写的printBits函数)时,我似乎错过了前3位.这对我没有意义,有人可以帮助我吗? 感谢大家的帮助,我添加了评论以显示我所做的更改.

int reverse(int n)
{
    int r = 0;
    int i = 0;
    for(i = 0; i < 29; i++) //Should be i < 32
    {
        r = (r << 1) + (n & 1); //| instead of + to make it obvious I'm handling bits
        n >>=1;
    }

    return r;
}

这是我的printBits函数:

void printBits(int n)
{
    int mask = 0X10000000; //unsigned int mask = 0X80000000;
    while (mask)
    {
        if (mask & n)
        {
            printf("1");
        }
        else
        {
            printf("0");
        }
        mask >>= 1;
    }
    printf("n");
}

一个工作?反转功能

int reverse2(int n)
{
    int r = n;
    int s = sizeof(n) * 7; // int s = (sizeof(n) * 8) -1

    for (n >>= 1; n; n >>=1)
    {
        r <<=1;
        r |= n & 1;
        s--;


    r <<= s;
    return r;
}

解决方法

你有:

int mask = 0x10000000;

这里有两个问题.你没有设置高位,如果你这样做了,它仍然(可能)不起作用,因为你的编译器会在signed int上使用算术移位.

您想要将面具更改为:

unsigned int mask = 0x80000000;

对于算术移位,向右移位0x80000000将永远不会变为零,因为符号位将神奇地扩展到其他位.有关算术移位的更多详细信息,请参见here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读