c ++中的二进制表示回文

时间:2018-03-07 09:16:30

标签: c++ bit-manipulation palindrome

我是按位运算符的新手,我试图显示数字的回文表示,对于n = 32(0010 0000),它应输出4(0000 0100)但它给出的值我是随机的,例如对于上面的输入,而不是4,我得到2,如果我尝试3(00000011)它不会给我192 11000000 ...它给了我6(0000 0110)和所以...我确定代码是错的,我只是想知道在哪里。顺便说一句,我已经检查了其他帖子,但是我没想到它

#include <iostream>
using namespace std;

int main ()

{
int n,k;

cout<<"Dati n: ";cin>>n;

while(n>0){

    k=k<<1;
    if(n & 1 == 1)
    k |= 1<<1;
    n=n>>1U;

}
cout<<k;

}

2 个答案:

答案 0 :(得分:0)

可能的解决方案是使用std::bitset

std::bitset<8> bs(3); // 0000 0011
std::string palindrome = bs.to_string(); // "0000 0011"
// reverse the string representation
std::reverse(palindrome.begin(), palindrome.end()); // "1100 0000"

std::cout << bs.to_ulong() << std::endl;
std::cout << std::bitset<8>(palindrome).to_ulong();

给出这个结果:

3
192

答案 1 :(得分:-1)

如果您使用的是GCC,则可以使用其中一个builtin functions

uint32_t palindrome( uint32_t num ) {
   return __builtin_bswap32(num);
}

palindrome(2U)将返回33554432(0x2000000)

优点是编译器将使用处理器中的二进制交换指令(如果可用)。对于x86_64,例如:

palindrome(unsigned int):
  mov eax, edi
  bswap eax
  ret