昨天用C/C++寫B(tài)ase64編碼,結(jié)果老是不對,
比如
unsigned char A =;
unsigned char B = ;
unsigned char C = ;
unsigned char a, b, c, d;
a = A >> 2;
b=(A << 6) >> 2|(B>>4);
c = ((B << 4)) >> 2) | (C >> 6);
d = (C << 2) >> 2;
結(jié)果發(fā)現(xiàn)bcd值都不對
但是寫成
b = A<< 6;
b = b >> 2;
b=b|B>>4;
就可以,查看b計算兩種方式匯編
第一種
00BACB66  movzx       eax,byte ptr [ebp-1F9h]  
00BACB6D  shl         eax,6  
00BACB70  sar         eax,2  
00BACB73  mov         byte ptr [ebp-1C9h],al  
第二種
00BACB79  movzx       eax,byte ptr [ebp-1F9h]  
00BACB80  shl         eax,6  
00BACB83  mov         byte ptr [ebp-1EDh],al  
00BACB89  movzx       eax,byte ptr [ebp-1EDh]  
00BACB90  sar         eax,2  
00BACB93  mov         byte ptr [ebp-1EDh],al  
問題就在指令sar,這是算數(shù)右移位指令,會保留最高位,而第二種可以是因為movzx  將高位已經(jīng)置零
找到了原因,可以寫為
a = A >> 2;
b=((unsigned char)(A << 6)) >> 2|(B>>4);
c = (((unsigned char)(B << 4)) >> 2) | (C >> 6);
d = ((unsigned char)(C << 2)) >> 2;
只要涉及到右移,保證操作數(shù)是無符號就可以了。