2016-12-19 11 views
1

私は8桁の2つの16進文字列を持っています。これらの2つの16進文字列を適用して操作し、次に7ビットに右シフトを適用して10進値を取得する必要があります。私は16進数の文字列を長さ4(8 * 2 = 32ビット= 4バイト)のバイト配列に変換しようとしましたが、同様の順序で個々のバイトに対して&の演算を行い、長さ4の別のバイト配列に結果を保存しました。このバイト配列に?出力与えるdata1Bytes間バイト配列の右シフト

Ex : data1 in hex: 0x40003019, 
    data1 in bits: 0100-0000 0000-0000 0011-0000 0001-1001, 
    data1 in bytes: 64 0 48 25, 
    data2 in hex: 0x00FFFF80, 
    data2 in bits : 0000-0000 1111-1111 1111-1111 1000-0000, 
    data2 in bytes : 0 255 255 128 

AND演算、data2Bytes:[0,0,48,0] bytearray1(これら0000-0000 0000-0000 0000-0000 0011から0000および小数点値のためのビットは12,288です)。

これまでのすべてのコンバージョンと計算は期待通りに機能しています。 今私は0000-0000 0000-0000 0000-0000 0110-0000(96の10進値)を与えるべきこの最終結果の7ビットを右にシフトする必要があります。

1)Iは右シフトをINTと適用するバイト配列を変換しようとしている

var res = BitConverter.ToInt32(bytearray1, 0); 
var shift = res >> 7; 

しかしRES = 3145728(12,228であること)およびシフトべき= 24,576(あるべきである96)

2 )私は疲れ逆の順序で[0,0,48,0] bitArrayになくビット得bitArrayにbytearray1変換された

var bitArray = new BitArray(bytearray1); 

bitArray [0] ... bitArrayは[19]、[20 bitArrayを偽= ] = bitArray [21] = true、bitArray [22] ... bitArray [31] = falseです。

bitArray [0] ----------- [31]:0000 0000 0000 0000 0000 1100 0000 0000この結果、間違った値をシフト

ビット。 私が逃していること、これで私を助けてください?

+1

あなたは「右シフト」と言っていますが、あなたの例は00110000から01100000に左シフトしています。どちらが正しいですか?おそらく '' 'を' << 'に置き換えるだけでよいでしょう... –

+0

@MatthewWatsonこんにちは、最後のビット表現を見ているならば、私はbytearray1をbitArrayに変換した後にビット配列に格納されたビットを示したところです。バイト間の操作と操作の後、私の最終結果を右シフトする必要があります。 –

+1

ええと、しかし、あなたは「今度は、0000-0000 0000-0000 0000-0000 ** 0110-0000 **を与えるはずのこの最終結果の7ビットを右にシフトする必要があると言う。前のステップが '0000-0000 0000-0000 ** 0011-0000 ** 0000-0000'は、左シフトです。 –

答えて

0

私はこれがあなたのために働いていない理由はわからないが、私はそれをしようとすると、明白なアプローチは動作します。

まずあなたがuint値の2進数を持っていると仮定します。

uint data1 = 0x40003019; 
uint data2 = 0x00FFFF80; 

今だけ、それら一緒にして、正しい結果をシフト:

uint anded = data1 & data2; 
uint result = anded >> 7; // Gives 96 as requested. 

これは96の結果を与えます。

あなたの入力はフォームstring str = "0x40003019";の文字列である場合は、そのようuintに変換することができます:

uint data1 = uint.Parse(str.Substring(2), NumberStyles.HexNumber); 

str.SubString(2)はちょうど"0x"プレフィックスを取り除くことです。入力文字列に接頭辞が"0x"でなければ不要です。

+0

こんにちは、はい私は同じようにあなたがしたように結果を得ました。ご協力いただきありがとうございます。 –

-2

は、次の試してみてください。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 


namespace ConsoleApplication33 
{ 

    class Program 
    { 

     static void Main(string[] args) 
     { 
      List<string> digits = new List<string>() { 
            "0000","0001","0010","0011","0100","0101","0110","0111", 
            "1000","1001","1010","1011","1100","1101","1110","1111" 
           }; 
      string input = "0100-0000 0000-0000 0011-0000 0001-1001"; 
      byte[] bytes = input.Split(new char[] { '-', ' ' }).Select(x => (byte)digits.IndexOf(x)).ToArray(); 
      ulong number = BitConverter.ToUInt64(bytes,0); 
      Console.WriteLine(number); 
      Console.ReadLine(); 
     } 
    } 


} 
+1

7k担当者がコードを正しくフォーマットすることができると思いますか? – Liam

+1

これはまた、OPが望んでいることを全くしません。あなたはビットシフトを実行していませんか? – Liam

+0

BitConverterでYesです。 – jdweng