符号なし整数型のビット演算に取り組んでいます。uint8_t、uint16_t、...、uint64_t 型の左循環シフト関数を書きたいです。
私の解決策は次のとおりです。
(void*) left_circular_shift(void* number, size_t size);
サイズが 64 の場合、void* を uint64_t などに変換しますが、多くのプログラマーは void* の使用を避けます。すべての符号なし整数型に対してその関数を実装する必要がありますか?
符号なし整数型のビット演算に取り組んでいます。uint8_t、uint16_t、...、uint64_t 型の左循環シフト関数を書きたいです。
私の解決策は次のとおりです。
(void*) left_circular_shift(void* number, size_t size);
サイズが 64 の場合、void* を uint64_t などに変換しますが、多くのプログラマーは void* の使用を避けます。すべての符号なし整数型に対してその関数を実装する必要がありますか?
あなたの場合、void* は使用できません。void* を取るジェネリック関数がある場合、取得したもののサイズを測定することはできません (数値がどこで終了するかをどのように知るのでしょうか?) ため、キャストバックすることはできません。
Void* が「安全」であることについて: 「安全ではない」と聞いたことがあるかもしれない理由は、それが一般的な型のないポインターであるため、扱っているデータの種類を正確に知る必要があるためです (キャストバックする必要があります)。そのため、不注意に使用すると、予期しない奇妙なエラーが発生する可能性が高くなります。
これを行う簡単な方法は、それぞれに 1 つの関数を使用することです。別のオプションは、他の人が提案したように、一般的なマクロを使用することです。
指す数値をシフトするために void ポインターを逆参照する必要があるため、これは許可されません。詳細を知らなくても、これはマクロが適切な場合である可能性があります。必要に応じて、数値変数をその場で変更できます。