2017-03-12 10 views
0

内の関数を翻訳:は、C++</strong> C++で書かれた以下の機能<strong>を考えると活字体

#define getbit(s,i) ((s)[(i)/8] & 0x01<<(i)%8) 
#define setbit(s,i) ((s)[(i)/8] |= 0x01<<(i)%8) 

私は互換性の活字体の機能にそれらを有効にするにはどうすればよいですか?

私が思い付いた:

function setbit(s: string, i: number): number { 
    return +s[i/8] | 0x01 << i % 8; 
} 

function getbit(s: string, i: number): number { 
    return +s[i/8] & 0x01 << i % 8; 
} 

私はa |= b相当a = a | bであることが判明、私はgetbit機能の実装についてはよく分かりません。また、私は実際にそれらの機能が何をすべきか理解していません。誰かがそれらを説明できますか?

ありがとうございます。

編集:私は本当にバイナリ表現の文字列を必要としないので、

function setBit(x: number, mask: number) { 
    return x | 1 << mask; 
} 

// not really get, more like a test 
function getBit(x: number, mask: number) { 
    return ((x >> mask) % 2 !== 0); 
} 

@Thomasからのアイデアを使用して、私はこれをやってしまいました。

+1

これらはC++の機能ではありません。それらはマクロです - 型はありません –

+0

まあ... C++で書かれています。 C++ライブラリには存在しません。私は間違った言葉を使いました。 –

+0

@EdHeal私はなぜあなたが質問されたように好きではないので、質問をdownvoteするのは分かりません...あなたはdownvotingせずにこれを明確にすることができます。いくつかの人々は、無作為のものにそれを失うことに多くの評判を持っていない... –

答えて

1

文字列はここでは適切な記憶域ではありません。そしてbtw、JS Stringsは16bit文字を使用しているので、可能なストレージの1/256しか使用していません。

function setbit(string, index) { 
    //you could do `index >> 3` but this will/may fail if index > 0xFFFFFFFF 
    //well, fail as in produce wrong results, not as in throwing an error. 
    var position = Math.floor(index/8), 
     bit = 1 << (index&7), 
     char = string.charCodeAt(position); 
    return string.substr(0, position) + String.fromCharCode(char|bit) + string.substr(position+1); 
} 

function getbit(string, index) { 
    var position = Math.floor(i/8), 
     bit = 1 << (i&7), 
     char = string.charCodeAt(position); 
    return Boolean(char & bit); 
} 

より良いのは、(型付きの)配列です。

function setBit(array, index){ 
    var position = Math.floor(index/8), 
     bit = 1 << (index&7); 
    array[position] |= bit; //JS knows `|=` too 
    return array; 
} 

function getBit(array, index) { 
    var position = Math.floor(index/8), 
     bit = 1 << (index&7); 
    return Boolean(array[position] & bit) 
} 

var storage = new Uint8Array(100); 
setBit(storage, 42); 
console.log(storage[5]); 

var data = []; 
setBit(data, 42); 
console.log(data); 

の両方で動作しますが、:

  • すべての型付き配列はメモリ割り当て(作成)した後に変更することはできません固定長を持っています。

  • 通常の配列は8bit/indexなどの通常の型ではありませんが、浮動小数点数では53Bitですが、パフォーマンス上の理由から、INT31(31ではなく32)符号。この場合、JSエンジンはこのことを少しでも最適化できます。メモリの影響を減らし、少し速くなります。

パフォーマンスがトピックの場合は、型付き配列を使用してください。あなたはこの事がどれくらい大きなものかを事前に知る必要があります。

+0

ありがとう、私はそれを使用する方法を理解していません。 C++のsetbitで、 'setbit(finalPos、3);'を適用した後、 'unsigned char finalPos = 0x00;' を実行すると、結果はfinalPosで '8 '\ b''になります。 C++で 'unsigned char'だったので、質問に' s:string'を書いたときに間違っていると思います。 –

+1

@AlexFlorin Sry、C(++)を扱ってからしばらくしていますが、imoこれはchar []やchar *のようなものでなければなりません。そうでなければ 's [(i)/ 8]'となります。センス。とにかく、JSのStringはプリミティブなので、変更することはできませんので、新しい文字列を返す必要があります。それ以外に、 'setBit(value:int、bit:uint):int {戻り値| 1 <<(bit&31)} 'となり、' setBit(0x00、3) 'も' 8'となる。 '\\ b''を取得するには、' String.fromCharCode() 'でこれを実行しなければなりません。両方の言語の構造を理解し、コードではなくロジックを移植することに戻ります。 – Thomas

関連する問題