用 float 做 bitwise operation

用 float 做 bitwise operation

學到一個有趣的方法,在 float 做快速的轉換.

[StructLayout(LayoutKind.Explicit)]
public struct SampleUnion
{
[FieldOffset(0)] public float f = 1;
[FieldOffset(0)] public int   i;
}

這邊需要先了多的是 C# 定義 variable 的時候其實 compiler 會自己跑去 memory 幫你決定每在 local variables 在 memory layout 上的位置.
而這邊的 “StructLayout(LayoutKind.Explicit)”
Explicit 就是告訴 C# 由我們來決定每個 variable 的記憶體位置.
“FieldOffset(#)” 就是定義接下來的變數在記憶體上的位置.

所以當 float & int 兩個都是 4 bytes 的 variable 都在 memory layout 的起始位置的話
就變成 4byte * 8 bits, 整整 32 bits 的記憶體重疊在同一個 memory block 裡面.

所以就可以透過 “i” 來拿到 “f” 的值, 但不是正常的轉換. 但處於 int 的情況下,如果不是用來做數值運算的話.
就可以用 bitwise 的方式來處理很多轉換而不需考慮 floating 的小數精度問題.

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料