var
CardID: array[0..5] of Byte;
      for j := 0 to 5 do
      begin
        CardName := CardName + format('%1x', [(CardID[j] shr 4) and $0F]);  //右移4
        CardName := CardName + format('%1x', [CardID[j] and $0F]);
      end;哪位兄弟帮忙解释一下。

解决方案 »

  1.   

    右移之后做and运算,但是究竟做什么的,还是弄不清楚……
      

  2.   

    这个的作用只是为了把CardId的每个Byte转为16进制,用IntToHex更容易理解  for j:=0 to 5 do
      begin
        CardName:=cardName+IntToHex(CardID[j],2);
      end;
      

  3.   

     [(CardID[j] shr 4) and $0F]
    相当于取CardID[j]得高四位
             [CardID[j] and $0F]
    相当于取CardID[j]得低四位CardName应该等于 CardID[0]到CardID[5]的高四位和低四位之和
    但最后究竟做什么得看只这些代码看不出来
      

  4.   

    var 
    CardID: array[0..5] of Byte; 
          for j := 0 to 5 do 
          begin 
            CardName := CardName + format('%1x', [(CardID[j] shr 4) and $0F]);  //右移4 
            CardName := CardName + format('%1x', [CardID[j] and $0F]); 
          end; 
    ================================================
    只看j=0 哈。假如CardID[0]等于195;二进制为 11000011;十六进制为$C3;
    第一句:
    CardID[0] shr 4  ;右移4位,得到00111100;00001100 and $0F 位运算,就是 00111100 和 00001111做and运算,得到00001100,也就是取低四位的运算,而得到的就是CardID[0]的高四位
    第二句:
    [CardID[0] and $0F 取低四位得到00000011;,将得到的数用format转为16进制字符串这两行的代码总的结果就是 先去CardID[0]的高四位,用format转为16进制表示,保存在字符串CardName 里,再取CardID[0]的低四位,追加到CardName 的后面所以呢如果CardID[0]等于195;那一个循环下来,CardName 里就保存了字符串'C3',6次循环下来就保存了CardID的整个16进制字符串了。简单点就是实现将PByte类型转为16进制形式的String类型。。
      

  5.   


    var 
    CardID: array[0..5] of Byte; 
          for j := 0 to 5 do 
          begin 
            CardName := CardName + format('%1x', [(CardID[j] shr 4) and $0F]);  //shr 向右移位操作,此处and $0F多余;
                                                                              //假定CardID[j] := 11110000,输出结果为1111
                                                                                                       
            CardName := CardName + format('%1x', [CardID[j] and $0F]);  //取一个字节的低四位;假定CardID[j] := 11110000,输出结果为0000
          end; 
    循环出来输出一组数据,就是把高四位和低四位分离出来!
      

  6.   

    如果能用IntToHex会更容易理解些,转换为16进制数据。