|
▼向井 さん:
おはようございます。
>>正直ですね!! プログラミングは、将来必要ないんですか?
>販売系の会社に就職が決まったのですが
>Excel自体バイトでの売り上げ入力しかしたことが
>なかったので少しは使えるようになろうと勉強はじめました。
再質問があってよかった。まちがってたので・・・・。
>
>> If RIdx Mod 16 = 0 Then
Cells(RIdx, 2).Value = RIdx / 16
' これだけで よいです。
>> Cells(RIdx, 3).Value = 0
>> End If
>最初の箇所で16の倍数を条件にしているのは分かったのですが
>(RIdx / 16) And 15
これでも動作しますが、And 15 は、無意味なので・・・。
16の倍数でない場合でも上位の4Bitを求めるなら
Cells(RIdx, 2).Value =(RIdx And (15 * 16)) / 16
これです。
ミスったお詫びに解説です。
10進数では、例えば、1500という数字の百の位を基準に値を求める時には、
1500/100=15 という計算をしますよね?
これで2桁を右にシフトしていることになります。
これは、1500÷10^2=15 ですよね?
つまり 1の位が 10^0
10の位が 10^1
100の位が 10^2
だから、
1500÷10^2=15 という計算式を立てるのですよね?
元の問題に戻って、
>該当する数字の上位4ビットと下位4ビットを求める
つまり、1バイトのを半分区切ったそれぞれを求めるということです。
でも、今度は、pcのメモリの単位ですから、数字が二進数になります。
例えば、10進数で 16を 2進数で表すと
00010000 ですよね?
これを上位4Bit(左から、4Bit)の値を求めるには?
上記の00010000が10進数なら、
÷10000(10^4)で4桁の右シフトが出来ますが、
00010000は 2進数なので
2^4という値で割らなければ桁をシフトできません。
よって、2^4=16 ですから、
Cells(RIdx, 2).Value = RIdx / 16
というコードになります。
次いで、
Cells(RIdx, 3).Value = 0
としたのは、下位4Bitは、16の倍数なら、常に0だからです。
先に記述した
>16の倍数でない場合でも上位の4Bitを求めるなら
> Cells(RIdx, 2).Value =(RIdx And (15 * 16)) / 16
これ・・・。
これで16の倍数でなくても上記4Bitが求められます。
RIdx And (15 * 16) -----> RIdx And (15 * 2^4)
この部分は、下位4Bitに値があっても 上記の演算で 0000になります。
つまり、RIdx And (15 * 16) の演算で元の値を超えない16の倍数になっています。
ですから、↑この部分は、
Ridx \ 16
とか
int(Ridx/16)
でも良いです。
|
|