C++ 如何反转位集中的位?

C++ 如何反转位集中的位?,c++,c++11,bits,bitset,C++,C++11,Bits,Bitset,例如,我有一个整数 a=10 它的二进制表示(对于32位整数)是 000000000000000000000001010 反过来,它就变成了 010100000000000000000000000000 现在我已经看到了这段代码,从这段代码可以实现这一点 x = ((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1); x = ((x & 0xcccccccc) >> 2) | ((x &am

例如,我有一个整数

a=10

它的二进制表示(对于32位整数)是

000000000000000000000001010

反过来,它就变成了

010100000000000000000000000000

现在我已经看到了这段代码,从这段代码可以实现这一点

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);

请检查此方法:)

#包括
#包括
模板
标准::位集反转(常数标准::位集和位集){
std::位集反转;
对于(inti=0,j=N-1;istd::cout更少的代码将为您赢得TopCoder SRM中的一些时间。以下是我将在TopCoder SRM中使用的内容(请现场观看):

#包括
#包括
#包括
#包括
int main(){
自动x=std::位集(10);

std::cout不使用任何标准库函数(除了打印结果):

#包括
#包括
常量int size=sizeof(int)*字符位;
int main()
{
int x=10;
int r=0;
对于(int i=0;i=1;
}
std::位集位(r);

std::cout这是位集上简单的直接就地方法:

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;
    }
}
模板
无效反向(标准::位集和b){
对于(标准::尺寸i=0;i
您尝试过循环和位掩码方法吗?请努力?是的,您建议的方法(来回转换为字符串)是正确的,但您可以直接反转位集。非常简单。您面临的问题是什么?建议的方法非常有效。通过字符串转换将需要一些不必要的循环和转换-1.将十进制转换为二进制。2.二进制转换为字符串。3.反转字符串。4.字符串转换为二进制。5.co将二进制转换为十进制。我对此投了反对票,因为您犯了一个简单的印刷错误-
str.end()+str.size()
。对于跨平台,可能是
sizeof(int)*CHAR\u BIT
而不是
32
?为什么不直接在位集上反转?如果您直接在输入位集上工作,则必须交换()2名成员,完成一半的通话。
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;
}
#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;
    }
}