次のようなものはありますか:
if((bitmap & BIT_WATER) && (bitmap & BIT_FIRE)) bitmap &= ~BIT_FIRE
または
if(bitmap & BIT_WATER) bitmap &= ~BIT_FIRE
ビット単位の操作のみを使用する単一のステートメントで、比較 (if) の必要性を排除しますか?
私は完全に、それぞれが完全に反対の2つの旗が設定されている場合、そのうちの1つをクリアすることを意味します.
次のようなものはありますか:
if((bitmap & BIT_WATER) && (bitmap & BIT_FIRE)) bitmap &= ~BIT_FIRE
または
if(bitmap & BIT_WATER) bitmap &= ~BIT_FIRE
ビット単位の操作のみを使用する単一のステートメントで、比較 (if) の必要性を排除しますか?
私は完全に、それぞれが完全に反対の2つの旗が設定されている場合、そのうちの1つをクリアすることを意味します.
が設定されていない場合は何もしないためbitmap & BIT_FIRE
、最初のケースでは回避できます。bitmap &= ~BIT_FIRE;
bitmap
BIT_FIRE
任意の方法で「ビット Y が設定されている場合、ビット X を設定する」ことはありません。
もちろん、たとえばBIT_FIRE
が よりも 1 ビット高いことがわかっている場合はBIT_WATER
、 を実行できますbitmap &= ~(BIT_WATER << 1)
。これにより、「より 1 ビット高い」がクリアされBIT_WATER
ます。
私のコメントを回答に昇格させます。乗算を使用していることに注意してください。
#include <iostream>
int main()
{
int long unsigned bitmap_with_water = 0xF300003F;
int long unsigned bitmap_without_water = 0xF300000F;
int long unsigned bit_fire = 0x03000000;
int long unsigned bit_water = 0x00000030;
bitmap_with_water &= ~(bit_fire * static_cast<bool>(bitmap_with_water & bit_water));
bitmap_without_water &= ~(bit_fire * static_cast<bool>(bitmap_without_water & bit_water));
std::cout << (void*)(bitmap_with_water) << "\t" << (void*)(bitmap_without_water) << std::endl;
return (0);
}
プログラム出力:
0xf000003f 0xf300000f
事前にシフトされたビット マスクの代わりにビット番号を使用できる場合:
bitmap &= ~(((bitmap >> SHIFT_WATER) & 1) << SHIFT_FIRE)
一般的な目的を書く必要がある場合clear_if_set(int test, int clear, int bitmap)
、この答えは役に立ちません。
これが特殊な機能で、火から水への移動距離がわかっている場合:
int water = bitmap & BIT_WATER;
int shifted = water << WATER_TO_FIRE_LSHIFT; // for example
bitmap &= ~shifted;
一発ギャグ:
bitmap &= ~((bitmap & BIT_WATER) << WATER_TO_FIRE_LSHIFT);
BIT_WATER と BIT_FIRE が同じビットでないと仮定すると、
の真理値表
if(bitmap & BIT_WATER) bitmap &= ~BIT_FIRE
は (BIT_WATER、古い BIT_FIRE、新しい BIT_FIRE)
0 0 0
0 1 1
1 0 0
1 1 0
つまり、少しの観点からは
BIT_FIRE = (~BIT_WATER)&BIT_FIRE;
1 0 0
1 1 1
0 0 0
0 1 0
あなたの2つのビットの間のギャップがわからないので、このようなものは過剰です.
newbit = ((~(bitmap>>BIT_WATER_BIT))&(bitmap>>BIT_FIRE_BIT))&1;
bitmap&=~BIT_FIRE;
bitmap|=newbit<<BIT_FIRE_BIT;
私がタイプミスをしなかったと仮定すると...また、特定のビット番号を利用し、一般的なことをしないと単純化できると思います(すべてを右にシフトしてから再び左にシフトするのではなく、BIT_WATERビットをシフトしてBIT_FIREに着陸します。ただし、それをより簡単にします。
ビットウォータービットが7でビットファイアビットが3の場合
bitmap = (((~(bitmap>>4))>>4)&(1<<3))&bitmap;
それともこれかも
bitmap = (((bitmap&(~BIT_WATER))^BIT_WATER)>>4)&bitmap;
ここで、>>4 は BIT_WATER と BIT_FIRE の間の方向とデルタです。適切なデルタを入力します。