| 
				   if (x==1) 
    return t0; 
      q=y/x; 
      y=y%x; 
      t1+=q*t0; 
   } while (y!=1); 
   return low16(1-t1); 
} 
// 生成52个16位子密钥,  userkey是128位密钥  Z是有52个元素的数组,存放生成的子密钥 
static void en_key_idea(word16 *userkey, word16 *Z) 
{ 
   int i,j; 
   /* shifts */ 
   for (j=0;j<8;j++) 
      Z[j]=*userkey++; // 第一组8个子密钥不移位 
   for (i=0;j<KEYLEN;j++) 
   {              
      i++;   //实现循环左移25位, 主要思想:后一组8个子密钥的第一个子密钥,是前一组8个子密钥的第二个子密钥的低7位和第三个子密钥的高9位合并成 
      Z[i+7]=((Z[i&7] << 9) | (Z[i+1 & 7] >> 7));  // 左移9位得到低7位,  右移7位得到高9位, 用或"|"合并  
      Z+=i&8;  //  Z为数组基地址, 每8次向前加8个单位, 即数组基地址加8 
      i&=7;  //  i每8次复位一次 
   } 
} 
// 生成解密密钥 
static void de_key_idea(IDEAkey Z,IDEAkey DK) 
{ 			
				 |