5

Int32値の範囲 (25 ~ 50 または 100 ~ 200 など) を保存する必要がありますが、多くのデータベースの再設計やその他の作業を避けるために、これらの両方の数値を保存するために単一を使用したいと考えています。その場合、各数値に16ビットしかないことに気づきましたが、それで問題ありません。

したがって、2 つの整数値を使用すると、これは非常に簡単になります。私は次のようなことができます:

int mask = 50; //Right bits will have 50
mask |= (25 << 16); //Left bits will have 25

Console.WriteLine("Mask is: {0}", mask);
Console.WriteLine("Left is: {0}", (mask >> 16));
Console.WriteLine("Right is: {0}", (mask & 0xFFFF));

これで、右の 16 ビットに値 50 が格納され、左の 16 ビットに値 25 が格納されます。

それで、質問は何ですか?

今、同じ手法を使用したいのですが、2 つの非整数を格納したいと考えています。たとえば、1.5 と 1.75、または 2.00 と 2.25 です。float.NET は、、、またはsingleのビット シフト演算子をサポートしていないようです。 さらに、これらの値も最終的に Javascript で読み取る必要があるため、使用するビット エンコーディングの浮動小数点がプラットフォーム間で完全に互換性があるかどうかは疑わしいです。doubledecimal

これを行う最善の方法は何ですか?私が検討しているアプローチの 1 つは、整数を使用するだけで、すべてを 1000 で割ることです。これにより、両方の数値で小数点以下 3 桁の精度が得られますが、long65 を超えるものを格納するには、すべてを として格納する必要があります。ただし、これが最善のアプローチであるかどうかはわかりません。たぶん、私が見逃している簡単なものがあります。

4

5 に答える 5

6

ちょっとした計算で解決できます。

最初に精度を修正します。たとえば、2桁で、数字の範囲は1000までです

both = Math.Round(num1, 2) * 10000 + Math.Round(num2, 2);

最初の 4 桁は num1 用で、次に num2 があります。

プロセスを逆に戻すことができます。

于 2012-07-11T19:22:21.080 に答える
3

10 進数の桁数が多くない限り、最も簡単な解決策は、各数値に必要な小数を掛けてから、両方の数値を int に変換し、ビット操作を実行して、結果をデータベースに格納することです。

それらを読むときは、単に数を分割してから、以前に使用した係数で割ります。

于 2012-07-11T19:22:16.370 に答える
1

あなたが求めているのは、数学では「ペアリング関数」と呼ばれています。

ペアリング関数はたくさんありますが、その中にはゲーデル、カントールなどがあります。

Godel pf は、ネストされた言語をエンコードするのには実用的ではありませんが、シンボルがそれほど多くない単純な言語には優れています。

于 2015-08-09T16:43:13.873 に答える
0

C# には BitConverter があります。DB の Float 値をコードでバイト配列に変換し、必要な操作を行ってから、DB に保存する前に Float に戻すことができます。

例については、以下の投稿を参照してください。

C#: Byte 配列を float に変換する

于 2012-07-11T19:22:07.430 に答える
0

この質問への回答から float から byte[] への変換を使用できます。

バイト配列がある場合は、マスキング手法を使用できます。

于 2012-07-11T19:22:46.640 に答える