2017-05-03 3 views
0

私はJavaに変換できるように、このcppコードを理解しようとしています。 r1は符号なしのint ビットフィールドですが、ここではブール値に設定されているようですか?CPP unsigned int値でbooleanがどのように使用されていますか?

union GpioPins { 
    struct { 
     unsigned int ignoredPins1:2; 
     unsigned int r1:1; 
     unsigned int g1:1; 
     unsigned int b1:1; 
    } bits; 
    uint32_t raw; 
    GpioPins() : raw(0) {} 
    }; 

はその後

GpioPins *bits = ... 
uint8_t red = 141; // any number between 0..255 
uint8_t mask = 1 << i; // i is between 0..7 

bits->bits.r1 = (red & mask) == mask; 

混乱されている行を含むループの最終的なものです。 (red & mask) == masktrueまたはfalseに解決されませんか?

つまり、Javaで、これは次のようになります。後で、その後

private static class GpioPins { 

    static class Pins { 
     int ignoredPins1; 
     int r1; 
     int g1; 
     int b1; 
    } 

    int raw = 0; 
    Pins bits; 
} 

GpioPins bits = ... 
int red = 141; // any number between 0..255 
int mask = 1 << i; // i is between 0..7 

bits.bits.r1 = (red & mask) == mask; // compile error, incompatible types 

私はcppのコードでは理解していないが、それが何であるかを知らない何かが明確にありgoogleそれに:-)

+2

http://en.cppreference.com/w/cpp/language/bit_field –

+0

C++整数の真理がどのように機能するのか理解していますか? – chrylis

+0

@chrylisあなたが意味することは、0は偽であり、他のすべての数は真であるということですか? – Blundell

答えて

1

truefalseにない(red & mask) == mask決意をしていますか?

はい、あります。

次に、r1への割り当て時に、あなたのtrueまたはfalseがそれぞれ値1または0で、unsigned intに強制されます。 C++にはの暗黙の変換があります。

3

boolunsigned intに割り当てることは、C++で行うべき法的なことです。 true1に設定され、false0に設定されます。これはC++で暗黙的に行われます。

Javaでは、暗黙的にintにbooleanを割り当てることができないため、bits.bits.r1 = (red & mask) == mask;という行は機能しません。

はこれを試してみてください:bits.bits.r1 = ((red & mask) == mask) ? 1 : 0;

+1

標準では、 'bool'を' int'に暗黙的に変換すると '1'(' true'を保持している場合)となります([参照ページ](http://en.cppreference.com/ww)参照)/cpp/language/implicit_conversion)) - それは「普通」ではなく常に – UnholySheep

+1

ようこそ、トニー。今日のあなたの答えのいくつかを見てください。がんばり続ける! –

関連する問題