頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


ビット演算子のチルダ(~)って何やねん?

久々にMetalで描画するためにいろいろとコードを見てたりするのだが、Appleのコード(※1)に下のような面白いのがあった。
// The 256 byte aligned size of our uniform structures
static const size_t kAlignedSharedUniformsSize = (sizeof(SharedUniforms) & ~0xFF) + 0x100;
シェーダに渡すデータサイズを256バイトの倍数だといくらになるのかを計算している。
SharedUniformsという構造体(※2)のデータサイズを満たしつつ、256の倍数だといくらかを得たい。メモリの確保も必要になるので当然なるべく小さい方がいい。
構造体の中身がどんなのでもこの式でOKというものだけど、、、

なんて難解なんだ!

そんな難解な記述しなくてもええやん、と突っ込みたくなる。

なんだよ?0xFFの前の~(チルダ)は?!

調べるとビット演算でチルダはビット反転(補数を作る)なんだそうな(※3)。
0xFFは2進数だと全部1だから、その補数ってことは2進数では
…11 0000 0000
ってことか?
これとの&だから16進数で言うと下2桁をゼロにして、それより上のビットはそのままをキープできる。ここはすでに256の倍数。下2桁分は切り捨ててるようなものだから、あとで+0x100してる。
0x00との&だと上の桁までゼロにしちゃうから0xFFの補数を使ってたのか。



※1 ↓ここにも書いてるようにXcodeでプロジェクト新規作成時にARKitアプリで描画にMetal、言語にObjective-Cを選択した場合にできるコード。
SCNGeometryからMDLMeshを作成する

※2 ↓SharedUniforms はこんな構造体として定義されてる
typedef struct {
    // Camera Uniforms
    matrix_float4x4 projectionMatrix;
    matrix_float4x4 viewMatrix;
    matrix_float4x4 displayTransform;
    
    // Lighting Properties
    vector_float3 ambientLightColor;
    vector_float3 directionalLightDirection;
    vector_float3 directionalLightColor;
    float materialShininess;
} SharedUniforms;
※3 参考サイト
もう一度基礎からC言語 第19回 いろいろな演算子~ビット演算子 ビット演算子
スポンサーサイト

<< iPhone 6のフロントパネルを自分で交換修理してみた  TopPage  SCNGeometryからMDLMeshを作成する >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1285-2843ea64




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad