这个反转位顺序功能怎么了?
发布时间: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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容