有没有简便的办法可以把一个十六进制数字进行移位操作?
比如:0x672300,左移一位,变成0x723000,左移二位,变成0x230000?
右移一位,变成0x067230,右移二位,变成0x006723?

解决方案 »

  1.   

    >> 移位
    右移运算符 (>>) 将第一个操作数向右移动第二个操作数所指定的位数。备注
    如果第一个操作数为 int 或 uint(32 位数),则移位数由第二个操作数的低五位给出(第二个操作数 & 0x1f)。如果第一个操作数为 long 或 ulong(64 位数),则移位数由第二个操作数的低六位给出(第二个操作数 & 0x3f)。如果第一个操作数为 int 或 long,则右移位是算术移位(高序空位设置为符号位)。如果第一个操作数为 uint 或 ulong 类型,则右移位是逻辑移位(高位填充 0)。用户定义的类型可重载 >> 运算符;第一个操作数的类型必须为用户定义的类型,第二个操作数的类型必须为 int。有关更多信息,请参见 operator。重载二元运算符时,也会隐式重载相应的赋值运算符(如果有)。示例
      复制代码 
    // cs_operator_right_shift.cs
    using System;
    class MainClass
    {
        static void Main() 
        {
            int i = -1000;
            Console.WriteLine(i >> 3);
        }
    }
     输出
      
    -125
     请参见
    参考
    C# 运算符概念
    C# 编程指南其他资源
    C# 参考
      

  2.   


    0x672300 << 4  // 十六进制左移1位
    0x672300 << 8  // 十六进制左移2位
    0x672300 >> 4  // 十六进制右移1位
    0x672300 >> 8  // 十六进制右移2位
      

  3.   

     int a1 = 0x672300;
     int a2=a1>>4;
     int a3 = a1 >> 8;
     int a4 = a1 << 4;
     int a5 = a1 << 8;
    结果:
    a2=0x00067230
    a3=0x00006723;
    a4=0x06723000;
    a5=0x67230000;
    并不是想要的结果!
      

  4.   


            static void Main(string[] args)
            {
                int i = 0x672300;
                Console.WriteLine(i);
                Console.WriteLine(Left(i, 1));
                Console.WriteLine(Left(i, 2));
                Console.WriteLine(Right(i, 1));
                Console.WriteLine(Right(i, 2));
            }        static int Left(int num, int digit)
            {
                string s = Convert.ToString(num, 16);
                if (digit > s.Length)
                    return 0;
                s = s.Substring(digit).PadRight(s.Length, '0');
                return Convert.ToInt32(s, 16);
            }        static int Right(int num, int digit)
            {
                string s = Convert.ToString(num, 16);
                if (digit > s.Length)
                    return 0;
                s = s.Substring(0, s.Length - digit).PadLeft(s.Length, '0');
                return Convert.ToInt32(s, 16);
            }
      

  5.   

    非常感谢各位,特别是天行健。还有一个类似的问题:
    如果0x0008表示-1,0x000c表示1,0x0010表示-2,0x0014表示2,0x0018表示-3
    以此类推,十六进制增加4,十进制正负交替增加1。如何表示它们的关系?
    比如已知0x01FC,可以知道表示63?
      

  6.   

    十六进制的一位就是2进制的四位
    所以2进制中
    a>>=1;
    十六进制中就是
    a>>=4;
      

  7.   

    新问题:
    如果0x0008表示-1,0x000c表示1,0x0010表示-2,0x0014表示2,0x0018表示-3 
    以此类推,十六进制增加4,十进制正负交替增加1。如何表示它们的关系? 
    比如已知0x01FC,可以知道表示63?
      

  8.   

    前面的问题已经解决!新问题:
    如果0x0008表示-1,0x000c表示1,0x0010表示-2,0x0014表示2,0x0018表示-3 
    以此类推,十六进制增加4,十进制正负交替增加1。如何表示它们的关系? 
    比如已知0x01FC,可以知道表示十进制63?
    谢谢!
      

  9.   

       int _Value = 0x0008;            int _Test=0;
                if (_Value % 8 == 0)
                {
                    _Test = (_Value / 8 * -1);
                }
                else
                {
                    _Test = _Value / 8;
                   
                }
      

  10.   

    >> 和 << 已经是最简单的了
      

  11.   

    左移一位:
                             A1 = 0x00673200
    A1 << 4         -> Temp1 = 0x06732000
    A1 & 0x11111111 -> Temp2 = 0x00111100
    Temp1 & Temp2   ->    A2 = 0x00732000
      

  12.   

    我想问下:
    十六进制(如0x00000011)强制赋值给BYTE类型(如:BYTE RGB = 0x00000011)
    RGB的值是11还是17?
      

  13.   

    忽然想明白了:
    BYTE是UINT8(如0x00),而赋值为UINT32(0x00000011)
    BYTE RGB只能取到UINT32值的最后两位,即"11"
    RGB == 0x11;
    若赋值为0x11111111,BYTE RGB = 0x11111111;
    则RGB还是0x11;