Проблема со сдвигом бита (проверьте, является ли двоичное число палиндромом)

Мне нужна помощь с кодом, который проверяет, является ли двоичное число палиндромом. Предположим, что на входе 21 (10101). В функции я делаю это:

-копировать значение num1 в num2

-теперь число 1 равно 00010101, а число 2 равно 00010101.

-сдвинуть (вправо) бит 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

Итак, мой код следующий. И у меня проблема, потому что я не знаю, как остановить последнее время (пока с условием: 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;
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
188
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предложенное вами решение кажется очень сложным.
Я бы предложил подход наивный, в котором вы просто повторяете биты один за другим, начиная с обоих концов целого числа. Как только есть разница в этих битовых состояниях, можно сделать вывод, что это не палиндром.
Если достигается середина целого числа, то мы можем заключить, что это палиндром.

#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;
}

Ok. Я попытаюсь. (Вопрос: как ты это делаешь так быстро? Я подумаю, что я тупой :0 )

Riccardo 20.07.2019 11:54

Я самоучка в С++, и я заканчиваю свое руководство по книге. Я знаю такое понятие, как ввод-вывод, если еще переключать список векторов массива ООП-класс перечисляемый указатель пространства имен указатели полиформизма наследование и алгоритм, такой как сортировка выбором, быстрая сортировка, поиск, рекурсия бинарного поиска и т. д. И я делаю упражнения, рекомендованные моей книгой, но слишком часто работаю медленно, и мой разум останавливается. Часто я не очень хорошо знаю, как начать более сложный проект. Это нормально?

Riccardo 20.07.2019 12:01

Я программирую много лет. Это нормально

stark 20.07.2019 14:36

@Riccardo Когда вы программируете годами, вы сталкиваетесь со многими ситуациями. Затем каждый раз, когда проблема похожа на то, что вы уже делали, это звонит в колокольчик, и вы быстро находите решение не так уж и плохо, вдохновленное тем, что вы уже знаете. Но это не относится к программированию, это просто вопрос времени, какой бы ни была область.

prog-fh 20.07.2019 16:24

Другие вопросы по теме