使用按位运算符比较两个字符

标签 c compare bit-manipulation

我需要比较两个字符,如下例所示: 示例:

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/

相关文章:

c - 为什么我不能只使用 51 <= j <= 55?/数据类型

c - 是否可以在 C 中编写与类型无关的函数,并在实现中派生类型?

java - 有没有办法通过功能而不是值(value)来比较两种方法?

c - 我的基于 C 的程序崩溃了,分配了太多内存

c - 在研究 K&R 的 "The C Programming Language"之前要学习/研究哪些主题(基础知识或基础或基础知识或什么)?

C++ 操作模板对象

compare - VHDL 无符号向量与整数比较

c - C中按位异或的打印结果

c++ - 显示非常大的数字,由 byte[] 表示

c - 64 位移位的错误答案