2010-07-07 4 views
1

Donné ce court (signé):VB.NET Manipulation de bits: comment extraire des octets à court?

&Hxxxx 

Je veux:

  • Extrait du &HxxFF la plus droite SByte (signé)
  • Extrait du &H7Fxx gauche comme octet (non signé)
  • Identifiez si le &H8xxx le plus à gauche est positif ou négatif (résultat booléen)
+1

Bitwise et est votre ami. –

+3

Le bit le plus sig est 0x8000 plutôt que 0xf000 btw. –

+0

Droit. question mise à jour. – Shimmy

Répondre

0

Euh ...

value & 0x00ff 
(value & 0xff00) >> 8 
(value & 0xf000) >= 0 

EDIT: Je suppose que vous voulez que la valeur d'octet et non seulement les 8 bits supérieurs.

0

(en ligne char getLsb (short s) { return s & 0xff; }

inline char getMsb(short s) 
{ 
    return (s & 0xff00) >> 8; 
} 

inline bool isBitSet(short s, unsigned pos) 
{ 
    return (s & (1 << pos)) > 0; 
} 
0

Extrait le plus droit 0xxxff

myShort & 0x00FF 

Extrait de la gauche 0xffxx

(myShort & 0xFF00) >> 8 

Identifiez si le 0xfxxx le plus à gauche est positif ou négatif (c'est un short signé ).

(myShort & 0xF000) >= 0; 
0
  • Extrait le plus droit & HxxFF comme SByte (signé)

    CType(s AND &H00FF, SByte)

  • Extrait gauche & H7Fxx comme octet (non signé)

    CType((s AND &H7F00) >> 8, Byte)

  • Identifier si le plus à gauche & H8xxx est positif ou négatif (résultat bool)

    s AND &H8000 > 0

Je pense que ceux qui travaillent, depuis un certain temps je travaille dans VB

1
Dim test As UInt16 = &HD 'a test value 1101 
Dim rb As Byte 'lsb 
Dim lb As Byte 'msb - 7 bits 
Dim rm As UInt16 = &HFF 'lsb mask 
Dim lm As UInt16 = &H7F00 'msb mask 
Dim sgn As Byte = &H80 'sign mask 

For x As Integer = 0 To 15 'shift the test value one bit at a time 
    rb = CByte(test And rm) 'get lsb 
    lb = CByte((test And lm) >> 8) 'get msb 
    Dim lbS, rbS As Boolean 'sign 

    'set signs 
    If (rb And sgn) = sgn Then rbS = True _ 
    Else rbS = False 

    If (lb And sgn) = sgn Then lbS = True _ 
    Else lbS = False 'should always be false based on mask 

    Console.WriteLine(String.Format("{0} {1} {2} {3} {4}", 
     x.ToString.PadLeft(2, " "c), 
     Convert.ToString(lb, 2).PadLeft(8, "0"c), 
     Convert.ToString(rb, 2).PadLeft(8, "0"c), 
     lbS.ToString, rbS.ToString)) 

    test = test << 1 
Next 
+0

@Shimmy - console dans une application de formulaire? c'est pourquoi j'utilise Debug, peu importe si c'est un formulaire ou une console. – dbasnett

+0

nevermind, j'ai aussi formaté le code pour convenir à vb 10 si vous remarquez qui est aussi la raison pour laquelle j'ai édité – Shimmy

+0

Je l'ai écrit en VB10 et cela a très bien fonctionné. – dbasnett

Questions connexes