例如,我有一个整数
a = 10;
它的二进制表示(对于32位整数)为
00000000000000000000000000001010
反过来它就变成了
01010000000000000000000000000000
现在我看到了这段代码,通过topcoder article可以实现这一点
x = ((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1);
x = ((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2);
x = ((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4);
x = ((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8);
x = ((x & 0xffff0000) >> 16) | ((x & 0x0000ffff) << 16);
现在有没有什么直接的方法可以达到同样的效果,也许是把位集转换成字符串,然后再把它反转过来,把位集转换成位集的字符串的构造函数和方法是如此的复杂,我似乎不知道该怎么做。
以下是我目前尝试的方法
#include <bitset>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <typeinfo>
#include <string>
using namespace std;
int main() {
const unsigned int k = 32;
int x = 10;
bitset<k> nf(x);
cout << nf << endl;
string str =
nf.to_string<char,string::traits_type,string::allocator_type>();
reverse(str.begin(), str.end() + str.size());
cout << str << endl;
return 0;
}
但我得到的输出是这样的:
00000000000000000000000000001010
G;ÿJG¥±žGsÿkìöUàä˜\éä˜\é
6条答案
按热度按时间ezykj2lf1#
这是直接在位集上的平凡inplace方法:
plicqrtu2#
更少的代码将为您在TopCoder SRM中赢得一些时间。以下是我在TopCoder SRM中使用的代码(请参见here直播):
jdgnovmf3#
不使用任何标准库函数(除了打印结果之外):
}
gcxthw6b4#
请检查这一种方法:)
unftdfkk5#
uhry853o6#
这个问题的目的是为了公平的时间比较而设置缓存条件。解决这个问题要完全按照提问的方式。
与其该高速缓存中逐出所有内容(如果您看到分页效应,这可能代价非常高),不如将所有相关内存故障恢复到一致状态,这可能要简单得多。
也就是说,设计一个简短的例程,以特定的顺序触及你所关心的一切。在每次计时运行之前(以及收集开始标记之前)立即执行它。
有了它,您就可以确切地知道当您开始计时时缓存的状态应该是什么。
这实际上并不能解决您面前的整个问题,但是,如果您可以在单用户模式下运行例程和/或在具有统计累加器的轻负载系统上分别运行它们,那么它可能就足够了。