2011-07-01 16 views
1

文字値をUTF-8形式から抽出しようとしています。私は2つの文字があると、私は別の文字=> 010000C++ビット操作

からの最初の文字=> 10111と6ビットから5ビット、私は10111010000と出力のを形成するためにそれらを組み合わせることでしょうどのように

ch1 = 10111; 
ch2 = 010000; 

を抽出0x5d0として16進数?文書番号writeを確認すると、文字を順番に読むことができるように見えるので、これをやり直す必要がありますか、それとも簡単な方法ですか?同様の機能はありますか?また、10111010000は11ビット長であるため、charバッファが必要になると思われます。これについてどうやって行くのか知っていますか?

+0

'union'はどうですか?アラインメントがプラットフォームに依存する可能性があるため、特別な注意が必要な場合があります。 – iammilind

+0

@ iammilindどのように私は組合を使用するのですか?あなたはその答えを詳述できますか? – Mark

答えて

3

シフトとさらに|または|=演算子を使用する必要があります。

unsigned int ch3 = (ch1 << 6) | ch2; 
// ch3 = 0000010111010000 

ここでは、unsigned intは16ビットと仮定しています。あなたのマイレージは異なる場合があります。

+0

最大のutf8を読むには最大21ビットが必要です。どうすればいい? – Mark

+1

それから、16進数で表示するには、 'std :: cout << std :: showbase << std :: hex;' – juanchopanza

+2

@Mark ['std :: bitset'](http:// www .cplusplus.com/reference/stl/bitset /)。代わりに、少なくとも32ビットであることが保証されている 'unsigned long int 'を使用することもできます。 – Maxpm

2

間違いなくshiftとORを使用する必要があります。

まず、正しいサイズの符号なし整数型を宣言します。私はstdint.hで定義されているC99型が好きですが、C++コンパイラはstdint.hを持たないかもしれません。 uint16_tがない場合は、unsigned shortを使用できます。これは16ビット幅で、11ビットを保持することができます。

次に、どのビットが上位ビットになるかを把握します。

unsigned short ch1 = 0x17; 
unsigned short ch2 = 0x10; 
unsigned short result = (ch1 << 6) | ch2; 
+0

最大抽出に要する時間は最大21ビットです。 charバッファ[]が必要ですか? – Mark

+0

@マーク、いいえ、このスレッドを参照してください:http://stackoverflow.com/questions/589575/c-size-of-int-long-etc。これによれば、標準では 'unsigned long'が32ビットであることが要求されます。 – juanchopanza

0

1:

char bytes[2] = { 0x17, 0x10 }; // for example 

unsigned short result = 0;  // 00000000 00000000 
result = bytes[0] << 6;   // 101 11000000 
result |= bytes[1];    // 101 11010000 

2:

:この場合には六角

std::cout << std::showbase << std::hex << <what you want to print>; 

としてそれをプリントアウトするためにそれらを一緒に結合するため、それがあるべきように見えます

std::cout << std::showbase << std::hex << result 
// output: 0x5d0 if it is little-endian, it depends on your operating system 
0

まず、K & R:「ビットフィールドに関するほとんどすべてが実装依存です。

MSのVisual Studio 2008で、次の作品:

#include <stdio.h> 
#include <string.h> 

struct bitbag { 
    unsigned int ch2 : 6; 
    unsigned int ch1 : 6; 
}; 

int main() 
{ 
    struct bitbag bits; 

    memset(&bits, 0, sizeof(bits)); 

    bits.ch1 = 0x17; // 010111 
    bits.ch2 = 0x10; // 010000 

    printf ("0x%06x 0x%06x\n", bits.ch1, bits.ch2); 
    printf ("0x%0x\n", bits); 

    return 0; 
} 

は出力を生成します。

0x000017 0x000010 
0x5d0 

私はそれがすべてのコンパイラで同じように動作することをguarenteeことができませんでしたが。 memsetには、パディングを0に初期化することに注意してください。

+0

そして、構造体でprintfを実行すると、それが動作する保証はありません。 –

+0

さらに、UTF-8には「可変ビット幅」が必要です。ビットレイアウトは最初のバイトに依存します。そしてそれらは全く存在しません。 – MSalters