• ベストアンサー

符号付32bit整数→16bit整数

以前、Excel関数を使って上位、下位に分かれた符号付16bit整数を32bit符号付整数に変換する式を見つけ使用させていただき大変助かっています 今回はそのまったく逆でExcel関数を使って符号付32bit整数を上位、下位に分かれた符号付16bit整数に分割したいのですが上手くいかずに困っています 解る方いらっしゃいましたら教えてください よろしくおねがいします

質問者が選んだベストアンサー

  • ベストアンサー
  • mt2015
  • ベストアンサー率49% (258/524)
回答No.2

あんまり検証していませんがこんな感じかな? セルA1に32bitの符号付整数が入っているとします。 A2に上位、A3に下位、A5を作業用に使用します。 A2:=INT(A1/65536) A3:=A5-65536*INT(A5/65536)-(A5>32768)*65536 A5:=IF(A2>=0,A1-MOD(A2,65536)*65536,A1-MOD(A2+32768,65536)*65536+2147483648)

wawawakaba
質問者

お礼

16bit → 32bit → 16bit と変換し検証しました 正、負、共に正しく変換できています、ありがとうございます (作業用のセルを作って)って発想が出来ませんでした とゆうか、そもそも数学の能力が低かったです 本当に助かりました、ありがとうございました

その他の回答 (1)

回答No.1

> 符号付32bit整数を上位、下位に分かれた符号付16bit整数に分割したいのですが 具体的にどうしたいのか?不明瞭です。 負数の場合とか、下位の一番上のビットが1で負数になる場合とか。 例えば、 -12345678(FF43 9EB2)を、 -189(FF43)と、-24910(9EB2) に分けたいなら、 A1に-12345678が入ってるとして、 B1:=RIGHT(DEC2HEX(A1,8),8) C1:=LEFT(B1,4) D1:=RIGHT(B1,4) とか。

wawawakaba
質問者

補足

情報不足で申し訳ありません データを渡す相手は三菱製PLCです、PLC内部では32bitデータとして使用するのですが他の理由で16bitでのやりとりになってしまいました ちなみに16bit整数は -32.768~32.767 32bit整数は -2.147.483.648~2.147.483.647で上位の一番上のビットが1で負になるようです 例として 32bit30000→16bit上位0、下位30000 32bit-30000→16bit上位ー1、下位ー30000 32bit40000→16bit上位0、下位-25536 32bit-40000→16bit上位ー1、下位25536 32bit70000→16bit上位1、下位4464 32bit-70000→16bit上位ー2、下位ー4464 このようになるようです よろしくお願いします

関連するQ&A

  • Excel関数 16bit→32bi符号付き整数

    お世話になります。 Excel2010にて、16bit符号付き整数の上位・下位の値が元データとしてあり、 それを32bit符号付き整数に関数を使って変換したいのですが、方法がわからず、質問させて頂きます。 例 セルA1に下位用 -1640 セルA2に上位用 -1 の時に セルA3に32bit符号付き整数表示 わかられます方、ご助力のほどよろしくお願い致します。

  • itoaは4バイト整数を

    数文字列に変換しますが 8バイト整数を10進数整数文字列に変換する関数はあるでしょうか? また逆にatoiのように兆単位の10進整数整数文字列を8バイト整数に変換する関数はあるでしょうか? OSは98seでコンパイラはBorland C++5.51を使っていてAPIやSTLなどでプログラミングしています

  • 16bitで乱数を生成する方法

    cのrand()関数を使用せずに、 16bitの整数演算で、乱数を生成したいのですが、 何か良い方法はありませんでしょうか? 以下のように作ってみたのですが、時と場合によっては、 繰り返しになるみたいです。 なお、8bitのPICマイコンを使用しております。 宜しくお願い致します。 ****longを2バイトとする。*** #define _ULONG unsgined long _ULONG g_ulSeed = 31; _ULONG rand2() { _ULONG ulTemp; g_ulSeed = ( 2045 * g_ulSeed ) % 32768; g_ulSeed = g_ulSeed % 0xfff0;      // 上位8bitと下位8bitの入れ替え ulTemp = ( g_ulSeed & 0xff ) << 8; g_ulSeed = ulTemp | (g_ulSeed >> 8 ); return g_ulSeed; }

  • SSEを利用した差分の総和の求め方

    現在、できるだけ速く、距離計算を行いたいと考えています。 具体的には、8bit符号なし整数列の距離計算です。 SSEを利用するのが速いので、 _mm_sad_epu8()を使って組みました。 確かに高速に動作しておりますが、 本当はSAD(絶対誤差の総和)ではなく、SSD(2乗誤差の総和)を求めたいのです。 8bitの符号なし整数列を32bitの符号付き整数列に置き換えてから、 計算するのだとは思いますが、どのように組めば効率が良いのか分かりません。 計算の流れは、 ・8bit→32bit ・32bit整数列の差分 ・32bit整数列の乗算(2乗) ・32bit整数列の総和 となると思いますが、 8bit→32bitを行う関数も見当たらないですし、 符号付き32bit整数列の乗算関数も見当たりません。 どなたかご存知であれば、教えていただけると幸いです。

  • C言語で分からないところがあります。整数値の分割取得みたいなこと・・

    C言語で分からないところがあります。整数値の分割取得みたいなこと・・ で困っています。 僕はC言語初心者です。 コンパイラはVC2008です。 今回整数値を分割して取得したいと考えています。 例えば次のような整数値(int型)があったとします。 235465667 この整数値を3つにわけて取得したいのです。つまり 235 465 667 としたいのです。このような働きをしてくれる便利な関数はないのでしょうか? 調べてみたのですが、内容が内容だけに探しにくくて見つけられませんでした。 もし、関数がなければ、どのようにすれば取得できるかコードを教えてほしいです。 よろしくお願いします!

  • ハフマン符号のプログラム

     以下の問題に回答できる方,いらっしゃいましたらソースファイルと実行結果を送ってください。  ファァイル(記号列)を読み込んで,ハフマン符号によりファイルを圧縮するプログラム(C言語)を作成する(プログラムは,圧縮を行うものと,解凍を行うものの2つ作る)。また,いくつか適当なファイルに対して,圧縮を行い圧縮率を測定する。 (1)圧縮プログラムについて  圧縮のステップ  (a)入力ファイルを読み込み各記号の出現頻度をカウントする。  (b)得られた出現頻度を使って各符号のハフマン符号を生成する。  (c)各符号の出現頻度を出力ファイルに書き出す。  (d)もう一度入力ファイルを読み込みながら各符号をハフマン符号で置き換え    て出力ファイルに出力する。圧縮ファイルの形式は次のようになる。   0x00の  0x01の … 0xffの 先頭文字の 2文字目の … 終端文字の   出現頻度 出現頻度 出現頻度 符号語   符号語    符号語    (c)で書きこむ部分      (d)で書きこむ部分 (2)解凍プログラムについて  解凍のステップ  (a)各符号の出現頻度を圧縮ファイルから読み込む。  (b)得られた出現頻度を使って各符号のハフマン符号を生成する。  (c)圧縮ファイルの符号語を読み込みながら各符号のハフマン符号と比較しも    し一致したらその記号を解凍ファイルに出力する。  (d)(c)をファイルの終わりもしくは出現頻度をすべて足し合わせた記号数分処   理するまで繰り返す。  関数について  関数get_bit  ファイルから1bit読み込んで戻り値として返す。  (ファイルポインタはグローバル変数で用意する)  関数put_bit  引数として0,または1を渡すと1bitずつファイルに書き込む。  (ファイルポインタはグローバル変数で用意する)

  • フォトショップでbit数の変更を繰り返してもいいのですか?

    仕事で、フォトショップで写真画像を作成しています。 16bitで製作して、完成時に8bitにして納入しています。 今回、プロファイルの変換をしたいのですが、 16bitのままだと、オプションの『ディサを使用』が利用不可で、 8bitなら使用可能です、 一旦、8bitにして 『ディサを使用』をして、プロファイル変換をした後、 再び16bitに戻しても、失われるデーターはないのでしょうか?  あるいは、16bitのまま『ディサを使用』をせずに、プロファイル変換した方が良いのでしょうか? 『ロファイルの変換』以外にも16bitでは使用不可のツーツがありますが、 この時は8bitにして使用し、また16bitに戻すという事を繰り返しても良いのでしょうか? どなたか教えて頂けないでしょうか? よろしくお願いします。

  • 巡回符号について

    以下の問題についてお解りになる方、どうかご教授お願いします。 なるべく文章で表現したつもりですが、実際には図を見て回答するため、これだけではわからない!となるかもしれません。 問題 符号長7の二元巡回(7,4)の符号器を使用する。 この時、巡回符号の生成多項式を g(x) = x^3 + x + 1 とする。 問題1 情報桁を表す多項式が x^2 + x +1  であるとき 符号器が出力する符号多項式はどのようなものか。 問題2 この巡回符号のパリティ検査行列を求めよ。 問題3 この巡回符号の符号語を送信したとき、 受信多項式 y(x) が x^5 + x^4 + x^3 + x^2 +1 であるとする。この受信多項式y(x)の誤りを訂正せよ。

  • エクセル DEC2BIN 範囲外数値の演算

    エクセルの2進数変換関数の「DEC2BIN」について、 -32768から32767の範囲の数値を符号付の16bitへ変換したく、 調べたところDEC2BIN関数にたどり着いたのですが、 -512から511の範囲外では、使用できず、エラーが返ってきます。 何か良い解決策は、ないでしょうか? 初めての質問となりますが、よろしくお願いいたします。

  • 符号無し整数xを右にnビット回転

    C言語勉強中です。本、例題の中に、 符号無し整数xを右にnビット回転した値を返す関数rrotateと、 左にnビット回転した値を返す関数lrotate unsigned rrotate(unsigned x, int n) unsigned lrotate(unsigned x, int n) を作成せよ。 という例題がありました。 この例題の中の回転とは、どのような意味なのでしょうか? 何をどのようにしたらよいか、問題の意味がわかりません。 解る方教えてください。よろしくお願いします。

専門家に質問してみよう