如何反转位集中的位?
How to reverse bits in a bitset?
例如,我有整数
一个=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);
现在有没有一些简单的方法可以达到同样的效果。也许通过将我们的 bitset 转换成一个字符串,然后反转它?将 bitset 转换为 bitset 的字符串的构造函数和方法非常复杂,我似乎无法弄清楚如何执行此操作。
这是我到目前为止尝试过的方法
#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àä˜\éä˜\é
请检查这个方法:)
#include <iostream>
#include <bitset>
template<std::size_t N>
std::bitset<N> reverse(const std::bitset<N> &bit_set) {
std::bitset<N> reversed;
for (int i = 0, j = N - 1; i < N; i++, j--) {
reversed[j] = bit_set[i];
}
return reversed;
}
int main() {
std::bitset<32> b1(10);
std::bitset<32> reversed_b1 = reverse(b1);
std::cout << b1;
std::cout << "\nand reversed\n" << reversed_b1 << std::endl;
return 0;
}
更少的代码会让您在 TopCoder SRM 中赢得一些时间。以下是我将在 TopCoder SRM 中使用的内容(实时查看 here):
#include <algorithm>
#include <bitset>
#include <iostream>
#include <string>
int main() {
auto x = std::bitset<32>(10);
std::cout << x << std::endl;
auto str = x.to_string();
std::reverse(str.begin(), str.end());
auto y = std::bitset<32>(str);
std::cout << y << std::endl;
return 0;
}
不使用任何标准库函数(除了打印结果):
#include<iostream>
#include<bitset>
const int size = sizeof(int)*CHAR_BIT;
int main()
{
int x = 10;
int r = 0;
for(int i = 0; i < size; i++)
{
r = r << 1 | (x & 1);
x >>= 1;
}
std::bitset<size> bits(r);
std::cout << "Reverse " << bits << std::endl;
}
这是直接在位集上的简单就地方法:
template<std::size_t N>
void reverse(std::bitset<N> &b) {
for(std::size_t i = 0; i < N/2; ++i) {
bool t = b[i];
b[i] = b[N-i-1];
b[N-i-1] = t;
}
}
uint32_t reverseBits(uint32_t n) {
bitset<32> b(n); // store in binary form
string s=b.to_string(); //put it in string
string k(s.rbegin(),s.rend()); //reverse string
bitset<32>d(k); //again put new string k in bitset
return d.to_ulong(); //get value in decimal form
}
例如,我有整数
一个=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);
现在有没有一些简单的方法可以达到同样的效果。也许通过将我们的 bitset 转换成一个字符串,然后反转它?将 bitset 转换为 bitset 的字符串的构造函数和方法非常复杂,我似乎无法弄清楚如何执行此操作。
这是我到目前为止尝试过的方法
#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àä˜\éä˜\é
请检查这个方法:)
#include <iostream>
#include <bitset>
template<std::size_t N>
std::bitset<N> reverse(const std::bitset<N> &bit_set) {
std::bitset<N> reversed;
for (int i = 0, j = N - 1; i < N; i++, j--) {
reversed[j] = bit_set[i];
}
return reversed;
}
int main() {
std::bitset<32> b1(10);
std::bitset<32> reversed_b1 = reverse(b1);
std::cout << b1;
std::cout << "\nand reversed\n" << reversed_b1 << std::endl;
return 0;
}
更少的代码会让您在 TopCoder SRM 中赢得一些时间。以下是我将在 TopCoder SRM 中使用的内容(实时查看 here):
#include <algorithm>
#include <bitset>
#include <iostream>
#include <string>
int main() {
auto x = std::bitset<32>(10);
std::cout << x << std::endl;
auto str = x.to_string();
std::reverse(str.begin(), str.end());
auto y = std::bitset<32>(str);
std::cout << y << std::endl;
return 0;
}
不使用任何标准库函数(除了打印结果):
#include<iostream>
#include<bitset>
const int size = sizeof(int)*CHAR_BIT;
int main()
{
int x = 10;
int r = 0;
for(int i = 0; i < size; i++)
{
r = r << 1 | (x & 1);
x >>= 1;
}
std::bitset<size> bits(r);
std::cout << "Reverse " << bits << std::endl;
}
这是直接在位集上的简单就地方法:
template<std::size_t N>
void reverse(std::bitset<N> &b) {
for(std::size_t i = 0; i < N/2; ++i) {
bool t = b[i];
b[i] = b[N-i-1];
b[N-i-1] = t;
}
}
uint32_t reverseBits(uint32_t n) {
bitset<32> b(n); // store in binary form
string s=b.to_string(); //put it in string
string k(s.rbegin(),s.rend()); //reverse string
bitset<32>d(k); //again put new string k in bitset
return d.to_ulong(); //get value in decimal form
}