【问题标题】:Using XOR Bitwise Operation to Performa a Byte-By-Byte Comparison使用 XOR 按位运算执行逐字节比较
【发布时间】:2014-07-18 21:10:03
【问题描述】:

我想拿两个文件,逐字节比较,然后测试它的性能,

到目前为止,我的代码如下所示:

#include<stdio.h>
#include <time.h>

int main()
{
    FILE *fp1, *fp2;
    int ch1, ch2;
    char fname1[40], fname2[40] ;

    printf("Enter name of first file :") ;
    gets(fname1);

    printf("Enter name of second file:");
    gets(fname2);

    clock();    

    fp1 = fopen( fname1,  "r" );
    fp2 = fopen( fname2,  "r" ) ;

    if ( fp1 == NULL )
    {
        printf("Cannot open %s for reading\n", fname1 );
        exit(1);
    }
    else if (fp2 == NULL)
    {
        printf("Cannot open %s for reading\n", fname2 );
        exit(1);
    }
    else
    {
        ch1  =  getc( fp1 ) ;
        ch2  =  getc( fp2 ) ;

        while( (ch1!=EOF) && (ch2!=EOF) && (ch1 == ch2))
        {
            ch1 = getc(fp1);
            ch2 = getc(fp2);
        }

        if (ch1 == ch2)
            printf("Files are identical\n");
        else if (ch1 != ch2)
            printf("Files are Not identical\n");

        fclose ( fp1 );
        fclose ( fp2 );
    }

    printf("That took %d seconds.\n", clock() / CLOCKS_PER_SEC);

    return 0;
}

此代码比较两个文件是否相同,但我想使用 XOR 的按位运算进行检查,有什么想法可以做到这一点吗?

有什么方法可以一次读取一个字节的文件吗?

提前感谢您的帮助!

【问题讨论】:

  • 你说的是什么意思"但是我想检查一个文件本身是否有重复"
  • 我有一个想法,有没有一种方法可以一次读取一个字节的文件?对不起,这是一个错字,我只想使用 XOR 逐字节比较两个文件
  • 如果两个字节是相同的,那么在执行 XOR 位运算后,结果应该最终为零,但是我在实现这个时遇到了麻烦
  • 你真的想打印:“文件是相同的\n”每次一个字节匹配?即,如果您有一个 4 KB 的文件,您将打印此消息 4096 次。我认为答案是否定的。此外,如果您真的对性能感兴趣,那么您将把所有时间都花在打印上,而不是文件的实际比较上。您需要将结果放入 bool 并在函数末尾打印。此外,可能值得一提的是,如果编译器愿意,可以免费使用 XOR 进行相等性检查。您最好的选择通常是编写代码,以便读者清楚您的意图。
  • @Apriori 你是对的,我不想每次都有相同的字节时打印。但是, getc 选项不适用于我想要完成的任务。我只是注意到了。例如,它适用于 char,因为 char 是一个字节,但如果我正在读取带有数字的文件怎么办?它不再是一个字节。关于如何获取数字(例如 int)的任何想法,将其分解为 C 中可能的最低数据类型?谢谢

标签: c hash bit-manipulation xor duplication


【解决方案1】:

让您的代码完全按原样在您的主循环中更改如何?

 while( (ch1!=EOF) && (ch2!=EOF) && !(ch1 ^ ch2))
 {
    ch1 = getc(fp1);
    ch2 = getc(fp2);
 }

快速说明:您已经在逐字节读取文件。 getc() 仅从文件中读取一个字符,然后将其存储为 int。来自getc()函数的描述:On success, the character read is returned (promoted to an int value)

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多