2

まず第一に、私は非常に新しく、ビット単位の操作スタッフの知識が乏しいため、私の質問がばかげているように思われる場合は申し訳ありません..

したがって、Android アプリには 5 つのチェックボックスがあり、これらのチェックボックスの状態をバックエンドと同期する必要があります。しかし、真/偽の値を持つ 5 つの要素を持つ単純な JSON オブジェクトの代わりに、整数 (13 など) を取得し、すべてのチェックボックスの状態を表す整数を送信する必要があります。API ドキュメントには、次のように記載されています。

FromUri Int32 可視性 : 可視性 = 次の値のビットの "OR" 演算 None = 0、NameVisibile = 1 | Web 可視 = 2 | MobileVisible = 4 | DOBVisible = 8 | AddressVisible = 16

WebVisibleしたがって、これは、たとえばチェックボックスMobileVisibleDOBVisibleチェックボックスがある場合2 + 4 + 8 = 14、チェックボックスの状態を表すために番号14を送信して送信する必要があることを意味すると思いますか?

同じロジックで、BE から整数を取得した場合、このように解釈する必要がありますか?

public void test(int value){
    if (value >= 16){
        addressVisible = true;
        value -= 16;
    } else {
        addressVisible = false;
    }

    if(value >= 8){
        dobVisible = true;
        value -= 8;
    } else {
        dobVisible = false;
    }

    if(value >= 4){
        mobileVisible = true;
        value -= 4;
    } else {
        mobileVisible = false;
    }

    if(value >= 2){
        webVisible = true;
        value -= 2;
    } else {
        webVisible = false;
    }

    if(value >= 1){
        nameVisibile = true;
    } else {
        nameVisibile = false;
    }
}

これは、この問題を解決する正しい方法ですか? ビット単位の演算子を使用して同じことを行う「スマートな」方法がもっとあるのではないでしょうか?

4

1 に答える 1

2

これが機能する方法はかなり単純です。

Flag            Value   Binary

None            0       0x00000
NameVisibile    1       0x00001
WebVisible      2       0x00010
...

ビットごとの OR はそのように機能します

0 | 0 = 0
1 | 0 = 1
0 | 1 = 1
1 | 1 = 1

したがって、複数のフラグを OR (|) で結合すると、各フラグはバイナリ値で 1 か所しか使用されないため、それぞれの状態が保持されます。例えば

NameVisible | WebVisible = 0x00011

さて、あなたの質問に対処します。値を抽出するには、AND 演算子を使用できます。AND はそのように機能します

0 & 0 = 0
1 & 0 = 0
0 & 1 = 0
1 & 1 = 1

したがって、例の 0x00011 から値を取得し、それをテスト対象のフラグ (WebVisible など) と AND (&) します。

Value        WebVisible 
0x00011  &   0x00010     = 0x00010

この値はゼロではないため、WebVisible が true であることがわかります。

これは、ニーズに合わせて調整できる具体的なコードです。

public void test(int value){
    int addressVisibleFlag = 16;
    ...

    addressVisible = (value & addressVisibleFlag) != 0;
    ....
}

うまくいけば、これが役に立ちます。これは基本的に、関連するロジックの概要にすぎません。これはテストされておらず、Android の経験はほとんどありませんが、これで何かできるはずです。

于 2016-03-10T20:25:17.400 に答える