- 论坛徽章:
- 0
|
一个长度为12个字节的字符串"abcdefghijkl",把这段8*12bit长度的数据的偶数位(二进制位)变成0,即进行位运算。因为逐个字节运算速度慢,我想每次运算4个字节(即32bit)。使用循环,每次运算4个字节,当然是循环3次。我的办法是,把每4个字节看作一个long整型数据,位运算之后,使用memcpy()函数把结果拷贝到目标指针上。这样循环3次。下面写的代码,得不到正确的结果。
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- /**
- * 打印数值二进制值的函数
- **/
- void printNumber(unsigned long n, int length)
- {
- char str[length];
- itoa(n,str,2);//2即是代表转换为2进制
- //补足前面的0
- int count = length - strlen(str);
- int i;
- for(i=0; i<count; ++i)
- {
- printf("0");
- }
- //
- printf("%s",str);
- }
- /**
- * 打印字符串二进制值的函数
- **/
- void printString(char *s)
- {
- char c;
- unsigned long j=(unsigned long)s + strlen(s);
- for(; (unsigned long)s<j; s++)
- {
- c = *s;
- printNumber((unsigned long)c, 8);
- }
- }
- /**
- * 主函数
- */
- int main(int argc, char *argv[])
- {
- unsigned int length= 8;
- char src[8] = "abcdefgh";
- char dest[8] = "tttttttt"; //存放结果
- unsigned long* srcLong = src;
- unsigned long* destLong = dest;
- //
- unsigned long key1 = 0xaaaaaaaa; //1010....
- unsigned long n;
- //
- printNumber(key1, 32);printNumber(key1, 32); puts(":key1");
- printString(src); puts(":src");
- //
- //unsigned long * endLong = src + 8;
- unsigned int count = length/4;
- unsigned int i;
- for(i=0; i<count; i++) //srcLong < endLong
- {
- n = (*srcLong) & key1;
- //printString((char*)&n);
- memcpy((void *)destLong, (void *)&n, 4);
- srcLong += 4;
- destLong +=4;
- }
- printString(dest); puts(":dest");
- return 0;
- }
复制代码
|
|