2進法ビットの保存
解決したいこと
二進法を用いてケットを表現し、そのケットを別の配列で保存したい
今回はケットの中に2個だけ1が入るように設定している。
発生している問題・エラー
000
000
000
コンパイルはうまくいき、実際ケットは2個1が入っており、逆引きもうまく行っているように思える。が、ケットの保存がうまく行っていない
該当するソースコード
#include <stdio.h>
#define N 3 //サイト数
#define M 2 //half-filling
#define NUM_KET N*(N-1)/2
// ケットベクトルを2進法で保存する配列
int binaryKet[N];
int ket[NUM_KET][N];
// 2進数を10進数に変換する関数
int binaryToDecimal(int* binaryKet, int n) {
int decimal = 0;
for (int i = 0; i < n; i++) {
decimal = (decimal << 1) | binaryKet[i];
}
return decimal;
}
// 10進法から2進法のケットベクトルを取得
void DecimaltTobinary(int n, int decimalKet, int* binaryKet){
for (int i = n - 1; i >= 0; i--) {
binaryKet[i] = decimalKet & 1;
decimalKet >>= 1;
}
}
// ケットベクトルを2進法で配列に保存する関数
void getBinaryKet(int n, int ones, int* binaryKet, int index, int z) {
if (ones == 0) {
// 2つの1が配置されたケットベクトルを表示
for (int i = 0; i < n; i++) {
// printf("%d", binaryKet[i]);
ket[z][i]=binaryKet[i];
}
// printf(" (%d)\n", binaryToDecimal(binaryKet, n));
// printf("\n");
return;
}
if (index >= n) {
return;
}
// 1を配置する場合
binaryKet[index] = 1;
getBinaryKet(n, ones - 1, binaryKet, index + 1, z);
// 0を配置する場合
binaryKet[index] = 0;
getBinaryKet(n, ones, binaryKet, index + 1, z);
}
int main() {
int ones = M; // 1の個数
// ケットベクトルの生成と表示
// printf("Generated ket vectors:\n");
// getBinaryKet(N, M, binaryKet, 0);
int z=0;
while(z < NUM_KET){
getBinaryKet(N, M, binaryKet, 0,z);
z++;
}
for(int i=0;i<NUM_KET;i++){
for(int j=0;j<N;j++){
printf("%d",ket[i][j]);
}
printf("\n");
}
// 逆引きを行う例
int decimalKet = 5; // 10進法で指定するケットベクトル (例: 5は0101に対応)
DecimaltTobinary(N, decimalKet, binaryKet);
// 逆引き結果を表示
printf("Decimal: %d (Binary): ", decimalKet);
for (int i = 0; i < N; i++) {
printf("%d", binaryKet[i]);
}
printf("\n");
return 0;
}