5

DES アルゴリズムを実装してstd::bitset<56> permutationKeyおり、2 つに分割する必要があります。

std::bitset<56> permutationKey(0x133457799BBCDF);
std::bitset<28> leftKey;
std::bitset<28> rightKey;

std::bitset<56> divider(0b00000000000000000000000000001111111111111111111111111111);

rightKey = permutationKey & divider;
leftKey = (permutationKey >> 28) & divider;

に型キャストしようとしbitset<56>ましbitset<28>たが、うまくいきませんでした。

同じことを達成する他の方法は、反復して各ビットを個別に割り当てることです。ループを使わずに達成したいのですが、別の方法が必要です。

プリミティブ型でできました

uint64_t key = 0b0001010101010101110110001100001110000011111100000000011111000000;
                    //00010101.01010101.11011000.11000011---|---10000011.11110000.00000111.11000000
uint32_t right = (uint32_t)key;
uint32_t left = key >> 32;

どうすればbitsetこのように分割できますか?

4

2 に答える 2

2

u_long前の回答で提案された解決策は素晴らしいですが、一般的ではありません。ビットを失うことなく変換するには大きすぎるビットセットをどのように分割しますか? 直感的に、イテレータや範囲のようなものをここで探します。

vector<int> vec({1,2,3,4});
vector<int> vec1(vec.begin(), vec.begin() + vec.size() / 2); // {1,2}
vector<int> vec2(vec.begin() + vec.size() / 2, vec.end()); // // {3,4}

残念ながら、ビットセットには反復子と範囲がありません。変換速度をあまり気にしない場合は、次の単純で一般的な解決策を提案します。

const size_t size = ...  // we assume size is even
bitset<size> bss;
.......
const string str = bss.to_string();
bitset<size/2>bss1(str.substr(0, str.size() / 2));          // first half
bitset<size/2>bss2(str.substr(str.size() / 2, str.size())); // second half
于 2020-09-09T07:39:43.967 に答える