2011-10-28 7 views
2

文字セットは1および2バイト文字を持ちます。 1バイト文字は最初のビットとして0を持ちます。 だけバッファに文字が蓄積されます。ある時点で、ユーザがバックスペースを入力したとすると、どのようにして を効率的に削除できますか?1および2バイト文字を含む文字セットのバックスペースを実装します

私の頭に浮かんだ解決策は、1バイト文字(それは最も重要なビットとして0を持つ)を考える必要はなく、2バイト文字について考える必要があり、1と区別できる方法です私はそれを区別するために2バイトの文字に余分なビット(例えば0)を含めると考えましたが、それは多くの文字表現を食べるでしょう。

というアイデアがあります。

+2

この問題は処理できますが、なぜ2つの異なるサイズの文字を使用しているのか尋ねることはできますか?文字のサイズが異なる場合は、チェックする必要がある問題(バッファサイズなど)がたくさんあります。あなたは、あなたのソリューションを簡素化するために、すべての文字を2バイトにすることだけを考慮する必要があります。 – dbeer

+0

これは現実の問題か、ちょうど運動ですか? –

+0

これは第1弾です。すべてのキャラクターを2バイトにするとたくさんの記憶が浪費されることがあります。 – pravs

答えて

1

最初に何を意味しますか?
0xfade0b1111101011011110)の最初のビットは0または1ですか?

とにかく、「最初のビット」が常に最後に書き込まれるように、リトルエンディアンまたはビッグエンディアン形式で値を書き込むことができます。書かれた最後のオクテットだけを調べることによって、1オクテットか2オクテットを削除するかどうかを知ることができます。

+0

第1ビットは、あなたの例でMSBとその1を意味します。 – pravs

+0

OK ...リトルエンディアン形式で値を書き込みます。 '0x42 0x43 0xfa77 'というシーケンスは' 0x42 0x43 0x77 0xfa'と書かれます。バックスペースを取得したら、最後に書き込まれた値( '0xfa')をチェックし、2バイトを削除します。 – pmg

0

あなたがバッファに蓄積している場合は、「バックスペース」は、単にバッファに後方ライト・ポインタを動かすこと(そしておそらくNULでの書き込みビット宿題のように聞こえるが、...

新しい書き込みヘッド)。 1つの非常に簡単な実装は次のとおりです。

On backspace: 
    Move write pointer back one byte 
    If MSB != 0: 
    Move write pointer back one byte 
    Write NUL at current position 

これはあなたが探していたものですか?

+0

この解決法には欠陥があります。最後の文字が2バイトであったとします。この文字の2番目のバイトはゼロで始まる可能性がありますが、アルゴリズムはバッファを1バイトだけ減らします。 –

+0

@ ricola86私はそれを考えましたが、問題の定義が与えられているかどうかはわかりませんでした。彼は明白に「1バイトの文字にはMSBとして0があります」と述べています。私には、それは暗黙のうちに "2バイト文字はMSBとして0を持つことはありません。"これがどんなシステムであれ、彼は2バイト文字を強制して常に2バイト目にMSBを設定することができました。おそらくそれは間違っていた私の仮定です。 –

+0

@ denniston.t:ricola86が正しく言った、実際の問題は、この2バイト文字がMSBとして1を持つときです。 – pravs

0

独自の文字セットまたはエンコードを構成しないでください。 UTF-8を使用します。次に、書き込みポインタの前に文字の先頭を見つけるのが簡単です(2つの最上位ビットが0x10でない最も近いオクテットです)。心は、その後、文字は 2オクテットより長いことができますが、それはとにかく必要です。 65,792文字以上あります。

関連する問題