ビット演算
普段は google 電卓で間に合わせてしまうことも多いのですけど、 ビット論理演算は苦手な部分です。さらに四則演算においても 64bit 整数を扱っているとどうにも使い難いことが結構あります。なぜか実数扱いになってしまって in hex で16進表示にできないようなパターンですね。
そういうときは Wolfram Alpha を使うことにしています。
しかしこれも、技術専用の計算機ではなくて幅が広いものなので、プログラミング気分で式を書くとエラーになったり assume されたりすることもしばしばあります。
例えば 0x プレフィックスの16進記法は文脈によって解釈されません。 '|' や '&' といった論理演算子は使えますが、 xor がありません。
そういうときは関数フォームを使いましょう。
関数フォームといっても bitxor() ではありません。 bitxor[] です。
bitxor[ bitor[0xdead000000000000, 0x0c00000000000000, 0x00a0000000000000], 0x5555000000000000]結果は以下のようになります。
http://www.wolframalpha.com/share/clip?f=d41d8cd98f00b204e9800998ecf8427ea3esf8qete
まぁ、少々煩わしい。
通常、 wolfram alpha は、
to base16で HEX 変換してくれますが、入力が既に HEX で計算している場合に to base16 を付けてしまうとなぜか Result が表示されなくなり other base conversions にも base16 の結果だけが抜けてしまうのでめんどいです。
たぶんバグだと思うのですが……。ずっとこうですから……諦めてます。
この場合は、 to base16 を付けずに other base conversions の base16 結果を使うか、その下の other data types のところの more と big endian ボタンを押して 64bit integer 且つ Big Endian 表示の結果を手に入れましょう。
なぜデフォルトが Little なのか理解に苦しみますが、これももうずっとこうなので……。
more を押さないと 64bit integer や double precision floating point の結果が見られないのも、もう 21 世紀なんだから一つ頼むよ!と思うところです。
行列計算
あれば octave、 3D に特化した計算なら blender コンソールを使うのですけどちょっと今持ち合わせが……なときとかに重宝します。特に Blender コンソールは python 使える人には絶賛お勧めですよ。クォータニオンも使えるし。でも Matrix3, Matrix4 といったクラスベースなので、変態的な行列を使うときは逆にちょっと厳しい。
wolfram alpha での行列記法は, 2x2 の単位行列が
{{1, 0}, {0, 1}}です。 octave と大体一緒ですかね。むしろ却って馴染み易いかも。
行ベクトルが {0, 0} で列ベクトルが {{0, 0}} です。
注意するべきは、行列の転置は
transpose Mまたは M^T です。 M' でもなければ M^t でもありません。
簡単な例で言うと、2Dベクトル(0, 0)の平行移動(-1, -1)は
{{1 , 0, -1}, {0, 1, -1}, {0, 0, 1}} * {0, 0, 1}宗教上の理由で列ベクトルが使いたい人は
{{0, 0, 1}} * {{1 , 0, -1}, {0, 1, -1}, {0, 0, 1}}^Tです。DirectX 脳の人は注意してください。
例えば以下。 上向き単位ベクトルを 30deg 回転させるには
{{sqrt(3)/2 , -1/2}, {1/2, sqrt(3)/2}} * {0, 1}または
{{0, 1}} * {{sqrt(3)/2 , -1/2}, {1/2, sqrt(3)/2}}^T
結果は,
http://www.wolframalpha.com/share/clip?f=d41d8cd98f00b204e9800998ecf8427ecq2au706qv
0 件のコメント:
コメントを投稿