简要说明:问题与十六进制语言C的按位运算有关; O.S: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);
}
有人可以告诉我怎么做吗? THX
答案 0 :(得分:1)
按位操作通常很容易扩展到更大的数字。
执行此操作的最佳方法是将它们分成4或8个字节的序列,并将它们存储为uints数组。在这种情况下,这些特定字符串至少需要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;
}
答案 1 :(得分:0)
你肯定需要使用一个可以处理任意长整数的库。考虑使用libgmp:http://gmplib.org/
答案 2 :(得分:0)
在进行任何类型的按位操作之前,您需要使用整数。 "abeffccc"
不是整数。这是一个字符串。您需要使用strtol
之类的内容
首先将字符串转换为整数。
如果您的值太大而无法容纳到64位long long int
(0xFFFFFFFF,FFFFFFFF),那么您将需要使用Big Integer库或类似的东西来支持任意大的值。正如提到的H2CO3,libgmp是C中大数字的最佳选择。
答案 3 :(得分:0)
您可以尝试使用unsigned long
数组,而不是直接使用unsigned int
。每个unsigned int
保存32位或8个十六进制数字。因此,您必须将常量切换为每个8个十六进制数字的块:
unsigned int t1[3] = { 0xabef , 0xffcccaad , 0xddddffff };
请注意,为了理智,您应该以相反的顺序存储它们,以便t1
的第一个条目包含最低位。