セーブデータを64ビットフラグで管理しようとした時に、
何の気なしに↓のようなことをしていたら、どうも後半のビットがうまく操作できていない…。
unsigned long long savedata;
// セーブデータにフラグをセット
何の気なしに↓のようなことをしていたら、どうも後半のビットがうまく操作できていない…。
unsigned long long savedata;
// セーブデータにフラグをセット
void SetFlag(int bitNo, bool flag)
{
unsigned long long mask = ~(1 << bitNo);
unsigned long long add = (flag ? 1 : 0) << bitNo;
savedata &= mask;
savedata |= add;
savedata &= mask;
savedata |= add;
}
問題はビットシフト対象の1という整数がint型として扱われているため、32ビットしかないこと。
なので、32ビットを越える部分は…ちゃんと調べてませんが、たぶん全てのビットが0なのかな。
とにかくおかしくなるので直します。
// セーブデータにフラグをセット(改)
問題はビットシフト対象の1という整数がint型として扱われているため、32ビットしかないこと。
なので、32ビットを越える部分は…ちゃんと調べてませんが、たぶん全てのビットが0なのかな。
とにかくおかしくなるので直します。
// セーブデータにフラグをセット(改)
void SetFlag(int bitNo, bool flag)
{
unsigned long long one = 1;
unsigned long long one = 1;
unsigned long long mask = ~(one << bitNo);
unsigned long long add = (flag ? one : 0) << bitNo; // (0は…まあいいか)
savedata &= mask;
savedata |= add;
savedata &= mask;
savedata |= add;
}