static public string getSpell(string cnChar)
        {
            byte[] arrCN = Encoding.Default.GetBytes(cnChar);
            if (arrCN.Length > 1)
            {
                int area = (short)arrCN[0];
                int pos = (short)arrCN[1];
                int code = (area << 8) + pos;//区码移八位+位码-- 这步操作什么意思?进制转换,还是。?                                 
                int[] areacode = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };
                for (int i = 0; i < 26; i++)
                {
                    int max = 55290;
                    if (i != 25) max = areacode[i + 1];
                    if (areacode[i] <= code && code < max)
                    {
                        return Encoding.Default.GetString(new byte[] { (byte)(65 + i) });
                    }
                }
                return "*";
            }
            else
                return cnChar;
        }

解决方案 »

  1.   

    C#是用<<(左移) 和 >>(右移) 运算符是用来执行移位运算。  左移 (<<)   将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0。
      左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8。  x<<1= x*2 
      x<<2= x*4 
      x<<3= x*8 
      x<<4= x*16  同理, 右移即相反:  右移 (>>) 
      将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0。  右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8。  x>>1= x/2 
      x>>2= x/4 
      x>>3= x/8 
      x>>4=x/16
      

  2.   

    主要是不懂<< 8的 意义是什么  把2个16位的int 合成一个32位的int?
      

  3.   

    就是把字符编码的16进制转10进制比如一个汉字编码是ffaa转十进制的话就是11111111<<8+01100110,转完十进制就可以对应区码表里的汉字了
      

  4.   

    问题是这个函数你传个汉字进去。 int code = (area << 8) + pos 得到的code都是5位的。区位码表里的十进制码最大才8000多。你看后面的这段:int[] areacode = { 45217, 45253, 45761, 46318, 46826, 47010, 47297, 47614, 48119, 48119, 49062, 49324, 49896, 50371, 50614, 50622, 50906, 51387, 51446, 52218, 52698, 52698, 52698, 52980, 53689, 54481 };应该不是10进制吧