转化成字符串之后进行判断的思路很简单咱就不写了。
做一下进阶:你能不将整数转为字符串来解决这个问题吗?
我最初的思路:用二进制掩码异或判断。
学到了新知识:GCC内建函数__builtin_clz(
Count Leading Zeros,统计前导零个数)->获取二进制正数最大有效位。
细节:注意掩码获取时int最高位1往低位走时的步数。譬如,假设int有4bits,想要获取前两位是1的掩码,1100即1<<(4-1)>>(2-1)得到.一定一定不要乱了。
但,有一个漏洞我居然直接忽略了,我想当然地觉得十进制是回文二进制也是了(呜呜呜)
先贴一个给定十进制数判断其二进制是否回文吧,不能白写嗯嗯。
这个结合题目可以判断双基回文。//给定十进制数判断其二进制是否回文
#include <iostream>
#include <limits.h>//__builtin_clz所在的头文件
using namespace std;
unsigned msbn(int x)
{
// 获取有效位数,最大有效位是有效位数-1
return sizeof(int) * CHAR_BIT - __builtin_clz(x);
}
int main()
{
int x = 313;//这是一个双基回文捏
int goto_highest = sizeof(int) * CHAR_BIT - 1;
int offset = (msbn(x) - 1) / 2 + 1;
int h_step = __builtin_clz(x) - 1; // 高位:1从高往低走 0数目-1 步
int l_step = h_step + offset; // 低位:多走n的一半(向上取整)步
cout << h_step << " " << l_step << endl;
int lower_mask = ~(1 << goto_highest >> l_step);
int higher_mask = ~(1 << goto_highest >> h_step | lower_mask);
cout << higher_mask << " " << lower_mask << endl;
cout << (((x & lower_mask) ^ ((x & higher_mask) >> offset)) == 0) << endl;
return 0;
}
十进制回文判断:%和/就能解决(捂脸)
翻转一半的数字,节省时间防溢出。
bool isPalindrome(int x)
{
int left = x / 10, right = x % 10;
if (x < 0 || x != 0 && right == 0)
return false;
while (right < left)
{
right = right * 10 + left % 10;
left /= 10;
}
return left == right || left == right / 10;
}
标签:10,right,int,力扣,step,回文,left
From: https://www.cnblogs.com/sharlynOUO/p/17756949.html