我需要代码检查二进制数是否为回文式的帮助。假设输入为21(10101)。在函数中,我这样做:

-将num1的值复制到num2

-现在num1是00010101和num2是00010101

-shift(right)num1的位,而num1> 0

-现在num1为:00000000 | 10101000,num2为00010101 | 00000000

-将num1的位向左移位(一个)

-现在num1为:00000001 | 01010000,num2为00010101 | 00000000

-现在,当num1!= num2时,我比较每个循环的位并将num1左移,将num2右移。

-比较示例:

00000001|01010000

00010101|00000000
       |
       V
       1==1

下一个循环比较为0 == 0

所以我的代码如下。而且我有一个问题,因为我不知道如何停止最后一会儿(while条件时:num1!= num2 && flag == true)。显然,我写的条件不正确。但是我不怎么做。在这种情况下,如果它检查5位数,我想停止它。然后我想问我做的解决方案是否太难了,以及是否还有其他方法可以解决该问题(ps:我觉得困难的正常现象?因为我想解决办法是手动将十进制数转换为二进制数使用while(n> 0)-> n%2,而不是记住数组中的位,并对数组做一个简单的算法来检查反向;但是现在我想使用<>运算符重做该问题)。谢谢你们。
#include <iostream>

using namespace std;

int palindrome(unsigned short);

int main()
{
unsigned short num;

cout << "Inserisci un numero:\t";
cin >> num;

if (palindrome(num) == 1)
    cout << "Palindrome" << endl;
else
    cout << "Not palindrome" << endl;

cout << "\a";
return 0;
}

int palindrome(unsigned short num1)
{
unsigned short num2 = num1;
bool flag = true;

while (num1>0)
{
    num1 >>= 1;
}

num1 <<= 1;

while ((num1 != num2) && (flag == true))
{
    if ((num1 & 1) != (num2 & 1))
    {
        flag = false;
        break;
    }

    num1 <<= 1;
    num2 >>= 1;
}

return flag;
}

最佳答案

您提供的解决方案似乎非常复杂。
我建议您采用一种幼稚的方法,您只需从整数的两端开始逐位迭代这些位。
这些位状态一旦有所不同,您就可以得出结论,这不是回文。
如果达到整数的中间值,那么我们可以得出结论,这是回文。

#include <stdio.h>
#include <stdbool.h>

bool
palindrome(unsigned short num)
{
  int bit_count=8*(int)sizeof(num);
  int half_bit_count=bit_count/2;
  for(int i=0; i<half_bit_count; ++i)
  {
    bool low=(num&(1u<<i))!=0;
    bool high=(num&(1u<<(bit_count-1-i)))!=0;
    if(low!=high)
    {
      return false;
    }
  }
  return true;
}

int
main(void)
{
  unsigned short i1=0x00A0;
  unsigned short i2=0x05A0;
  unsigned short i3=0xA005;
  unsigned short i4=0x005A;
  printf("%hx --> %d\n", i1, palindrome(i1));
  printf("%hx --> %d\n", i2, palindrome(i2));
  printf("%hx --> %d\n", i3, palindrome(i3));
  printf("%hx --> %d\n", i4, palindrome(i4));
  return 0;
}

关于c++ - 使用移位位时出现问题(检查二进制数是否为回文数),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57123257/

10-13 06:18