3

C はシフトからのキャリーアウトを保持し、プロセッサ固有の .h で見つけることができると読みました。

これは本当ですか、それを使用する必要がありますか? または実行ビットを自分で解決する必要がありますか?

4

2 に答える 2

7

C のプリミティブ操作のキャリー ビットにアクセスする標準的な方法はありません。

より大きなデータ型でシフトを実行する必要があります。

uint16_t foo = ...;

uint32_t tmp = (uint32_t)foo << shift;
uint16_t result = (uint16_t)tmp;
uint16_t carry  = (uint16_t)(tmp >> 16);

または反対のシフトを実行することによって:

uint16_t result = foo << shift;
uint16_t carry  = foo >> (16 - shift);

この 2 番目のメソッドは、未定義の動作 ifshift == 0を呼び出すことに注意してください。したがって、そのケースを個別に処理する必要があります。

于 2013-05-31T14:57:09.337 に答える