1

以下の Java コードを C++ に変換するにはどうすればよいですか。それが処理されるように書くことができることは知って いますが、 andがtypedef unsigned char byte何を意味するのか理解できません。そして、どのように交換しますか|=<<=final

public static final long unsignedIntToLong(byte[] b) {
          long l = 0;
          l |= b[0] & 0xFF;
          l <<= 8;
          (l >>> 4) & 0x0F;

これらすべてを C++ でテストするにはどうすればよいですか。変換を行うときに実行できる単体テストはありますか。

4

3 に答える 3

5

まず|=、複合ビットごとの OR 代入です。a |= bは と同等でa = a | b、そのビットがaまたはのいずれかb(または両方) に設定されている場合、結果の各ビットが設定されます。

各ビットに適用される真理値表は次のとおりです。

a | b | result
--------------
0 | 0 | 0
0 | 1 | 1
1 | 0 | 1
1 | 1 | 1

次に、<<=同じですが、ビット単位の OR ではなく、左に少しシフトしています。既存のすべてのビットがその量だけ左に移動され、右が 0 で埋められます。

101 << 1 == 1010
110 << 2 == 11000

finalconst変数の定義は C++ と同じです。ただし、関数がオーバーライドされないようにしたいfinal場合は、関数が仮想関数でもある場合は、関数ヘッダーの末尾にタグを付けることができます (最初にオーバーライドするために必要です)。ただし、これは C++11 にのみ適用されます。これが私の言いたいことのです。

最後に、Java では演算子>>>と呼ばれます。unsigned right shift通常、>>ビットをシフトしますが、数値の符号を保持するために左端のビットをそのまま残します。時にはそれはあなたが望むものではないかもしれません. >>>符号が重要であると仮定する代わりに、常に 0 を配置します。

ただし、C++ では、signed変数の型の一部である現実です。変数>>が符号付きの場合は、Java のように右にシフトしますが、変数が符号なしの場合は、Java の符号なし右シフト ( >>>) 演算子のように動作します。したがって、C++ は、>>どちらを行うべきかを推測できるため、必要なのは のみです。

于 2012-06-03T23:17:53.773 に答える
3

|= は両方の言語で同じです。ビットごとの OR が += のように lhs 変数に適用されます。<<=; と同じです。それは左シフト演算子です。

unsigned long は注意が必要です。Javaではそのようなことはありません。

CppUnit があります。それを使ってみてください。

于 2012-06-03T23:17:11.293 に答える
0

C++ で最終クラスを作成する方法について、明確な答えはありません。ただし、Googleは多くの例を表示します。たとえば、プライベート コンストラクターまたは frend クラスです。

| | OR 演算子です。たとえば、0x10 | 0x10 = 0x11。

<< はビットシフト演算子です。たとえば、0b1 << 0b1 = 0b10、10 << 2 = 0b1000 などです。1 シフトすると、値が 2 倍になります。

例えば:

class Converter{
public:
    static Converter * createInstance()
    {
        return new Converter;
    }

    long unsignedIntToLong(unsigned char *b){
        long l = 0;
        l |= b[0] & 0xFF;
        l <<= 8;
        //..
        return l;
    }
private:
    Converter(){

    }
};
于 2012-06-03T23:21:30.120 に答える