【问题标题】:Set all unset bits of a number设置数字的所有未设置位
【发布时间】:2022-07-21 21:36:06
【问题描述】:

给定一个整数 n(1≤n≤1018)。我需要将此数字中的所有未设置位设置为设置。

我的方法:让最高有效位在位置 p,然后所有设置位的 n 将是 2p+1-1。

我的所有测试用例都匹配,除了下面显示的一个。

输入

288230376151711743

我的输出

576460752303423487

预期输出

288230376151711743

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
 
int main() {
    ll n;
    cin >> n;
    
    ll x = log2(n) + 1;
    cout << (1ULL << x) - 1;
    
    return 0;
}

【问题讨论】:

  • 关于成为精英 C++ 大师的秘密捷径有一个流行的神话:扔掉你的 C++ 教科书;取而代之的是做随机编码难题,否则,它们没有内在的学习价值,除了不良的编程习惯外,它们不会教任何东西。这个神话主要是由一堆点击诱饵网站传播的,这些网站承诺只要他们解决了他们的难题,就可以将任何人变成 C++ 超级黑客。最终每个人都意识到这些编码难题是多么无用。但是他们已经花费了大量时间编写一个又一个编码难题。他们没有什么可展示的。
  • 我很害怕我不明白这个问题。如果你设置一个大小为N bits 的整数的所有未设置的位,会不会将N bits 设置为1?

标签: c++ bit-manipulation


【解决方案1】:

典型的double 只有大约 15 个十进制数字。

log2(288230376151711743)的值为57.999999999999999994994646087789191106964114967902921472132432244...(使用Wolfram Alpha计算)

因此,该值被舍入为 58,这导致将位 1 置于比预期更高的数字。

作为一般建议,在处理整数值时应尽可能避免使用浮点值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多