0

简而言之:问题与十六进制语言 C 的按位运算有关;操作系统:Linux

我只想对“长”十六进制字符串进行一些按位运算。我尝试了以下方法:

第一次尝试:

由于溢出,我无法使用以下内容:

long  t1 = 0xabefffcccaadddddffff;
and t2 = 0xdeeefffffccccaaadacd;

第二次尝试:不起作用,因为 abcdef 被解释为字符串而不是十六进制

char* t1 = "abefffcccaadddddffff";
char* t2 = "deeefffffccccaaadacd";

int len = strlen(t1);

for (int i = 0; i < len; i++ )
    {
        char exor = *(t1 + i) ^ *(t2 + i);
    printf("%x", exor);
}

有人可以让我知道该怎么做吗?谢谢

4

4 回答 4

2

按位运算通常很容易扩展到更大的数字。

最好的方法是将它们拆分为 4 或 8 字节序列,并将它们存储为 uint 数组。在这种情况下,这些特定字符串至少需要 80 位。

对于 AND 它非常简单,例如:

unsigned int A[3] = { 0xabef, 0xffcccaad, 0xddddffff };
unsigned int B[3] = { 0xdeee, 0xfffffccc, 0xcaaadacd };
unsigned int R[3] = { 0 };

for (int b = 0; b < 3; b++) {
    R[b] = A[b] & B[b];
}

一个更完整的示例,包括扫描十六进制字符串并打印它们:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef unsigned int uint;

void long_Print(int size, const uint a[]) {
    printf("0x");
    for (int i = 0; i < size; i++) {
        printf("%x", a[i]);
    }
}

void long_AND(int size, const uint a[], const uint b[], uint r[]) {
    for (int i = 0; i < size; i++) {
        r[i] = a[i] & b[i];
    }
}

// Reads a long hex string and fills an array. Returns the number of elements filled.
int long_Scan(int size, const char* str, uint r[]) {
    int len = strlen(str);
    int ri = size;

    for (const char* here = &str[len]; here != str; here -= 8) {
        if (here < str) {
            char* tmp = (char*)malloc(4);

            tmp[0] = '%';
            tmp[1] = (char)(str - here + '0');
            tmp[2] = 'x';
            tmp[3] = '\0';

            sscanf(str, tmp, &r[ri--]);

            free(tmp);

            break;
        }
        else {
            sscanf(here, "%8x", &r[ri--]);
        }
    }

    for (; ri >= 0; ri--) {
        r[ri] == 0;
    }

    return size - ri;
}

int main(int argc, char* argv[])
{
    uint A[3] = { 0 };
    uint B[3] = { 0 };
    uint R[3] = { 0 };

    long_Scan(3, "abefffcccaadddddffff", A);
    long_Scan(3, "deeefffffccccaaadacd", B);

    long_Print(3, A);
    puts("\nAND");
    long_Print(3, B);
    puts("\n=");

    long_AND(3, A, B, R);
    long_Print(3, R);

    getchar();

    return 0;
}
于 2012-06-19T16:59:32.963 回答
0

您当然需要使用可以处理任意长整数的库。考虑使用 libgmp:http ://gmplib.org/

于 2012-06-19T16:55:29.600 回答
0

在进行任何类型的按位运算之前,您需要使用整数。"abeffccc"不是整数。它是一个字符串。您需要使用类似strtol 的东西首先将字符串转换为整数。

如果您的值太大而无法放入 64 位long long int(0xFFFFFFFF,FFFFFFFF),那么您需要使用 Big Integer 库或类似的东西来支持任意大的值。正如 H2CO3 所提到的,libgmp是 C 中大量数据的绝佳选择。

于 2012-06-19T16:57:00.157 回答
0

unsigned long您可以尝试使用数组,而不是直接使用unsigned int。每个都unsigned int包含 32 位或 8 个十六进制数字。因此,您必须将常量分成 8 个十六进制数字的块:

unsigned int t1[3] = { 0xabef , 0xffcccaad , 0xddddffff };

请注意,出于理智考虑,您应该以相反的顺序存储它们,以便 的第一个条目t1包含最低位。

于 2012-06-19T16:59:36.887 回答