2

次のようなものはありますか:
if((bitmap & BIT_WATER) && (bitmap & BIT_FIRE)) bitmap &= ~BIT_FIRE
または
if(bitmap & BIT_WATER) bitmap &= ~BIT_FIRE

ビット単位の操作のみを使用する単一のステートメントで、比較 (if) の必要性を排除しますか?

私は完全に、それぞれが完全に反対の2つの旗が設定されている場合、そのうちの1つをクリアすることを意味します.

4

6 に答える 6

2

が設定されていない場合は何もしないためbitmap & BIT_FIRE、最初のケースでは回避できます。bitmap &= ~BIT_FIRE;bitmapBIT_FIRE

任意の方法で「ビット Y が設定されている場合、ビット X を設定する」ことはありません。

もちろん、たとえばBIT_FIREが よりも 1 ビット高いことがわかっている場合はBIT_WATER、 を実行できますbitmap &= ~(BIT_WATER << 1)。これにより、「より 1 ビット高い」がクリアされBIT_WATERます。

于 2013-09-13T00:39:59.707 に答える
1

私のコメントを回答に昇格させます。乗算を使用していることに注意してください

#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
于 2013-09-13T01:20:30.193 に答える
1

事前にシフトされたビット マスクの代わりにビット番号を使用できる場合:

bitmap &= ~(((bitmap >> SHIFT_WATER) & 1) << SHIFT_FIRE)
于 2013-09-13T19:55:39.807 に答える
1

一般的な目的を書く必要がある場合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);
于 2013-09-13T03:03:18.173 に答える
0

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 の間の方向とデルタです。適切なデルタを入力します。

于 2013-09-13T14:33:50.063 に答える