- Jitta
- ぬし
- 会議室デビュー日: 2002/07/05
- 投稿数: 6267
- お住まい・勤務地: 兵庫県・海手
|
投稿日時: 2005-05-19 13:42
| 引用: |
|
具体的には、例えば、1バイト8ビットの中身が、3,2,1,1ビットの4つのデータ(2進数表示)になっている場合です。
|
ほえ?なんでよ。1バイト(8ビット)なら、2桁でしょ。4つもデータはないよ。10進で4桁なら、2バイト(16ビット)。3211(10)なら、0011 0010 0001 0001(BCD)。
0xf0でマスクして、右へ4ビットシフトした値を10倍し、0x0fでマスクした値を足す。これで1バイト処理。
((oneByte & 0xf0) >> 4) * 10 + (oneByte & 0x0f)
2バイト以上あるなら、右からnバイト目は100^(n-1)を掛けてやる。
_________________
|
- Jubei
- ぬし
- 会議室デビュー日: 2002/03/02
- 投稿数: 830
- お住まい・勤務地: 関西
|
投稿日時: 2005-05-19 14:11
諸農です。
BCDというのをちょっと調べてみました。
C#でベタベタなんですが、こんな感じでしょうか。
| コード: |
|
public static byte[] Int32ToBCD(int AInt)
{
bool minusFlg = AInt < 0;
StringBuilder intStr = new StringBuilder(AInt.ToString());
if (minusFlg) intStr.Remove(0, 1);
int len = intStr.Length / 2 + 1;
byte[] ret = new byte[len];
for (int i = 0; i < intStr.Length; i++)
{
if ((i % 2) == 0)
{
ret[i / 2] = byte.Parse(intStr[i].ToString());
ret[i / 2] <<= 4;
}
else
{
byte b = byte.Parse(intStr[i].ToString());
ret[i / 2] |= b;
}
}
byte plusminus = minusFlg ? (byte)13 : (byte)12;
if ((intStr.Length % 2) == 0)
{
ret[ret.Length - 1] = plusminus;
ret[ret.Length - 1] <<= 4;
}
else
{
ret[ret.Length - 1] |= plusminus;
}
return ret;
}
public static int BCDToInt32(byte[] ABcd)
{
bool minusFlg = false;
StringBuilder intStr = new StringBuilder(ABcd.Length * 2);
foreach (byte b in ABcd)
{
byte n;
n = (byte)(b >> 4);
if (n < 10) intStr.Append(Convert.ToString(n));
else
{
minusFlg = (n == 13);
break;
}
n = (byte)(b << 4);
n >>= 4;
if (n < 10) intStr.Append(Convert.ToString(n));
else
{
minusFlg = (n == 13);
break;
}
}
int ret = Convert.ToInt32(intStr.ToString().Trim());
if (minusFlg) ret *= -1;
return ret;
}
|
_________________ 諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005
十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
|
- Jubei
- ぬし
- 会議室デビュー日: 2002/03/02
- 投稿数: 830
- お住まい・勤務地: 関西
|
投稿日時: 2005-05-19 14:19
| 引用: |
|
0xf0でマスクして、右へ4ビットシフトした値を10倍し、0x0fでマスクした値を足す。これで1バイト処理。
((oneByte & 0xf0) >> 4) * 10 + (oneByte & 0x0f)
|
な、なるほど!0xf0と0x0fでマスクかぁ。。
私のコードは右に左にと忙しいコードでした(^_^;)
_________________ 諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005
十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
|
- あび
- ベテラン
- 会議室デビュー日: 2004/07/29
- 投稿数: 59
|
投稿日時: 2005-05-19 16:22
| 引用: |
|
Jittaさんの書き込み (2005-05-19 13:42) より:
| 引用: |
|
具体的には、例えば、1バイト8ビットの中身が、3,2,1,1ビットの4つのデータ(2進数表示)になっている場合です。
|
ほえ?なんでよ。1バイト(8ビット)なら、2桁でしょ。4つもデータはないよ。10進で4桁なら、2バイト(16ビット)。3211(10)なら、0011 0010 0001 0001(BCD)。
|
すみません、説明不足と例題の間違いでした。
8ビットの中身が 1011 0010 で、3,2,1,2ビットの4つのデータに分けるということは、
1011 0010
101-------------->=5
1 0----------->=2
0---------->=0
10-------->=2
作成されるデータは、5,2,0,2の4つになります。
|
- Jubei
- ぬし
- 会議室デビュー日: 2002/03/02
- 投稿数: 830
- お住まい・勤務地: 関西
|
投稿日時: 2005-05-19 16:55
| 引用: |
|
8ビットの中身が 1011 0010 で、3,2,1,2ビットの4つのデータに分けるということは、
| コード: |
|
1011 0010
101-------------->=5
1 0----------->=2
0---------->=0
10-------->=2
|
作成されるデータは、5,2,0,2の4つになります。
|
であれば、ベタベタにこんな感じでどうでしょうか。
| コード: |
|
private int BCDToInt32(byte ABcd)
{
int ret = 0;
byte Mask1 = (byte)224;
byte Mask2 = (byte)24;
byte Mask3 = (byte)4;
byte Mask4 = (byte)3;
StringBuilder intStr = new StringBuilder();
byte temp;
temp = (byte)(ABcd & Mask1);
temp >>= 5;
intStr.Append(temp.ToString());
temp = (byte)(ABcd & Mask2);
temp >>= 3;
intStr.Append(temp.ToString());
temp = (byte)(ABcd & Mask3);
temp >>= 2;
intStr.Append(temp.ToString());
temp = (byte)(ABcd & Mask4);
intStr.Append(temp.ToString());
ret = Convert.ToInt32(intStr.ToString().Trim());
return ret;
}
|
_________________ 諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005
十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
|
- Jitta
- ぬし
- 会議室デビュー日: 2002/07/05
- 投稿数: 6267
- お住まい・勤務地: 兵庫県・海手
|
投稿日時: 2005-05-20 20:04
| 引用: |
|
すみません、説明不足と例題の間違いでした。
8ビットの中身が 1011 0010 で、3,2,1,2ビットの4つのデータに分けるということは、
1011 0010
101-------------->=5
1 0----------->=2
0---------->=0
10-------->=2
作成されるデータは、5,2,0,2の4つになります。
|
???なんか、ランレングス圧縮みたいな感じ???
当然、8ビットは決まっているけれど、いくつのデータに分けるかは不明、ってことなんでしょうねぇ...例えば、1ビットずつ8つのデータであることもあり得る、と。
ビットシフトで追い出してクリアする
| コード: |
|
10110010 0ビット左シフト
10110010 0ビット右シフト
10110010 (8-3)=5ビット右シフト
00000101 →5
10110010 3ビット左シフト
10010000 3ビット右シフト
00010010 ((8-3)-2)=3ビット右シフト
00000010 →2
|
マスキング
| コード: |
|
0ビット目から3ビット目までが1のマスクデータを作る→[11100000]
論理積をとり、(8−3)ビット右シフトする→00000101
(0+3)ビット目から2ビットが1のマスクデータを作る→[00011000]
論理積をとり、(8−3−2)ビット右シフトする→00000010
|
_________________
|