我需要比较两个字符,如下例所示: 示例:
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()
,
但我需要使用按位运算符进行比较。
这是我现在所做的。
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,如果其中一个是大写字母,则对小写字母给予推荐。
最佳答案
使用异或很容易检查相等性。
假设大小写很重要,大小写字符在第 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;
}
关于使用按位运算符比较两个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17392664/