Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET位操作:如何从短字符中提取字节?_Vb.net_Bit Manipulation_Math_Short - Fatal编程技术网

VB.NET位操作:如何从短字符中提取字节?

VB.NET位操作:如何从短字符中提取字节?,vb.net,bit-manipulation,math,short,Vb.net,Bit Manipulation,Math,Short,鉴于此(签名): 我想: 将最右边的&HxxFF提取为SByte(签名) 将左侧&H7Fxx提取为字节(无符号) 确定最左边的&H8xxx为正还是负(布尔结果) 内联字符getLsb(短s) { 返回s&0xff; } 内联字符getMsb(短s) { 返回(s&0xff00)>>8; } 内联布尔isBitSet(短s,无符号pos) { 回报率&(10; } 提取最右边的0xxxff 提取左0xffxx 确定最左侧的0xfxxx是否为 肯定或否定(这是一个符号) 短) 嗯 编辑:我想您需

鉴于此(签名):

我想:

  • 将最右边的
    &HxxFF
    提取为SByte(签名)
  • 将左侧
    &H7Fxx
    提取为字节(无符号)
  • 确定最左边的
    &H8xxx
    为正还是负(布尔结果)
内联字符getLsb(短s)
{
返回s&0xff;
}
内联字符getMsb(短s)
{
返回(s&0xff00)>>8;
}
内联布尔isBitSet(短s,无符号pos)
{
回报率&(10;
}
提取最右边的0xxxff

提取左0xffxx

确定最左侧的0xfxxx是否为 肯定或否定(这是一个符号) 短)

编辑:我想您需要的是字节值,而不仅仅是上面的8位。

  • 将最右边的&HxxFF提取为SByte(签名)

    CType(s和&H00FF,SByte)

  • 将左侧&H7Fxx提取为字节(无符号)

    CType((s和&H7F00)>>8,字节)

  • 确定最左侧&H8xxx为正还是负(布尔结果)

    s和&H8000>0

我想这些工作已经有一段时间了,因为我已经在VB中工作了
Dim测试作为UInt16=&HD'a测试值1101
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
Dim rb作为字节'lsb Dim lb作为字节“msb”-7位 Dim rm As UInt16=&HFF'lsb掩码 尺寸lm为UInt16=&H7F00'msb掩码 Dim sgn作为字节=&H80'符号掩码 对于x为整数=0到15',一次将测试值移动一位 rb=CByte(测试和rm)“获取lsb lb=CByte((测试和lm)>>8)“获取msb Dim lbS,rbS作为布尔符号 "设置标志, 如果(rb和sgn)=sgn,则rbS=True_ 否则rbS=错误 如果(lb和sgn)=sgn,则lbS=True_ Else lbS=False“根据掩码应始终为False Console.WriteLine(String.Format(“{0}{1}{2}{3}{4}”), x、 ToString.PadLeft(2),“c), 转换.ToString(磅,2).PadLeft(8,“0”c), 转换.ToString(rb,2).PadLeft(8,“0”c), lbS.ToString,rbS.ToString))
test=test最大sig位是0x8000而不是0xf000 btw。对。问题已更新。@Shimmy-表单应用程序中的控制台?这就是我使用调试的原因,不管它是表单还是控制台。不过,如果您注意到这也是我编辑代码的原因,我还将代码格式化为适合vb 10
inline 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;
}
myShort & 0x00FF
(myShort & 0xFF00) >> 8
(myShort & 0xF000) >= 0;
value & 0x00ff
(value & 0xff00) >> 8
(value & 0xf000) >= 0
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