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

这个反转位顺序功能怎么了?,第1张

概述我很惭愧地承认我不太了解比特和位 *** 作,因为我可能应该这样做.我本周末尝试通过写一些“反转位数”和“计数ON位”功能来解决这个问题.我从 here开始做了一个例子,但是当我按照下面的方式实现它时,我发现我必须在< 29.如果我在< 32(如例子中所示)然后当我尝试打印整数(使用我写的printBits函数)时,我似乎错过了前3位.这对我没有意义,有人可以帮助我吗? 感谢大家的帮助,我添加了评论以显示 我很惭愧地承认我不太了解比特和位 *** 作,因为我可能应该这样做.我本周末尝试通过写一些“反转位数”和“计数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.

总结

以上是内存溢出为你收集整理的这个反转位顺序功能怎么了?全部内容,希望文章能够帮你解决这个反转位顺序功能怎么了?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1221816.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存