Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C从字符指针逐位读取_C_Pointers_Assembly_Bit Manipulation_Bit - Fatal编程技术网

C从字符指针逐位读取

C从字符指针逐位读取,c,pointers,assembly,bit-manipulation,bit,C,Pointers,Assembly,Bit Manipulation,Bit,我有一个指针 char *result 我的链接汇编程序在其中写入一些数据。 现在,我想从指针逐位读取数据。 我还知道写入数据的长度(以位为单位),因为我的汇编程序返回了该值。 有没有一种简单的方法可以做到这一点,或者我是否需要将其解释为字符,然后每个字符进行8次位移位?如果数据很长,这可能比逐位处理要快一些,因为它避免了除最后一个字节外的所有字节的位移位,以及缓存: void process(const char* start, size_t bitlen, void (*f)(char))

我有一个指针

char *result
我的链接汇编程序在其中写入一些数据。
现在,我想从指针逐位读取数据。
我还知道写入数据的长度(以位为单位),因为我的汇编程序返回了该值。

有没有一种简单的方法可以做到这一点,或者我是否需要将其解释为字符,然后每个字符进行8次位移位?

如果数据很长,这可能比逐位处理要快一些,因为它避免了除最后一个字节外的所有字节的位移位,以及缓存:

void process(const char* start, size_t bitlen, void (*f)(char)){
    int i, k;
    register char b;
    for (i = 0; i < bitlen / 8; i++){
        b = start[i];
        f(b & 1);
        f(b & 2);
        f(b & 4);
        f(b & 8);
        f(b & 16);
        f(b & 32);
        f(b & 64);
        f(b & 128);
    }
    b = start[i];
    for (k = 0; k < bitlen % 8; k++){
        f((b>>=1) & 1);
    }
}
void进程(常量字符*开始,大小字节,void(*f)(字符)){
int i,k;
寄存器字符b;
对于(i=0;i>=1)和1);
}
}

如果数据很长,这可能比逐位处理要稍微快一点,方法是避免对除最后一个字节之外的所有字节进行位移位,以及缓存:

void process(const char* start, size_t bitlen, void (*f)(char)){
    int i, k;
    register char b;
    for (i = 0; i < bitlen / 8; i++){
        b = start[i];
        f(b & 1);
        f(b & 2);
        f(b & 4);
        f(b & 8);
        f(b & 16);
        f(b & 32);
        f(b & 64);
        f(b & 128);
    }
    b = start[i];
    for (k = 0; k < bitlen % 8; k++){
        f((b>>=1) & 1);
    }
}
void进程(常量字符*开始,大小字节,void(*f)(字符)){
int i,k;
寄存器字符b;
对于(i=0;i>=1)和1);
}
}

逐位或一次处理8位。逐位或一次处理8位。有些平台的字符超过8位。请确保:将对f的8个调用替换为单个循环:`int j;对于(j=0;j@Tommylee2k这会毁了我避免每一位都移位的想法。使用-O3,相信你的编译器;-)上面的代码中至少有两个错误:(1)它对最后一个字节的处理与其他字节不一样-最后一个字节的传递取决于相应的位
0
1
,但是用于其他字节的展开部分通过
0
1。有些平台的字符超过8位。为了确保这一点:用一个循环替换对f的8个调用:`int j;对于(j=0;j@Tommylee2k这会毁了我避免每一位都移位的想法。使用-O3,相信你的编译器;-)上面的代码中至少有两个错误:(1)它对最后一个字节的处理与其他字节不一样-最后一个字节的传递取决于相应的位
0
1
,但用于其他字节的展开部分通过
0
1