2013-06-30 72 views
0

我需要比較兩個字符緊跟在例如兩個字符: 例子:比較使用位運算符

COMPARE('a','z') Will return -1 
COMPARE('a','A') Will return -1 
COMPARE('g','g') WIll return 0 
COMPARE('A','a') Will return 1 

在一般情況下,我需要比較他們就像在功能:strcmp(), 但我需要使用Comparsion的按位運算符。 這是我現在所做的。

int Lcmp(char unsigned first,char unsigned sec) 
{ 
    int i; 
    char unsigned mask=0x80; //mask = 10000000 in binary 
    for(i=0;i<7;i++) 
    { 
     if(first&mask&&(!(sec&mask))) //first>sec, Beacuase first had the sum 2^7 
     { 
      return 1; 
     } 
     else if((!(first&mask))&&(sec&mask)) //first<sec " " " " 
     { 
      return -1; 
     } 
     mask>>=1; //move the comparsion bit rigth 
    } 
    return 0; //CASE: first==sec 
} 

我的問題是;此代碼不起作用。 當我的意思是不工作:它總是給我沒有任何模式的假結果。 請修復它,謝謝。 注:我需要的功能應該在字典比較

編輯:

I added this statment after the mask decleretion. 
    if(first<'a'&&sec>='a') 
      first^=mask; 
     else if(first>='a'&&sec<'a') 
      sec^=mask; 

我做什麼是去除MSB當且僅當其中之一是上,給人一種advetege的小寫字母。

+0

但方法的第一個if-子句中完成,因爲它總是返回一些東西,結束Lcmp。 –

+1

您應該通過調試器來運行它,並在監視變量和表達式的同時逐行執行函數。 –

+0

@JoachimPileborg:有一個看OP的此評論:http://stackoverflow.com/questions/17389530/sorting-text-file-with-bubble-sort-in-c#comment25245963_17389530。 –

回答

0

平等是很容易檢查與異。

假設的情況下是顯著,上部和小寫字符在第6位相差與0x20的檢查的情況下,從而,以便掩蔽:

int Lcmp(char unsigned first,char unsigned sec) 
{ 
     unsigned char diff = first^sec; 
     if (!diff) 
     { 
       // bits the same 
       return 0; 
     } 

     if (diff & 0x20) 
     { 
       // case differs 
       if (first & 0x20) 
       { 
         // sec is capital 
         return -1; 
       } 
       // first is capital 
       return 1; 
     } 

     // same case - find highest different bit 
     char unsigned mask=0x80; 
     while (!(mask & diff)) 
     { 
       mask >>=1; 
     } 

     if (first & mask) 
     { 
       // first has highest differentbit set 
       return 1; 
     } 

     // sec has highest different bit set 
     return -1; 
}