对字符串进行位运算,用C语言怎么写?

jdgdf566 2018-08-08 06:15:08
一个长度为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;
}
...全文
512 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sghcpt 2018-08-09
  • 打赏
  • 举报
回复
楼主,可以试试下面代码~~只供参考。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/**
* 打印数值二进制值的函数
**/
void printNumber(unsigned long n, int length)
{
char str[246] = { 0 };
_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;
size_t j = strlen(s);
size_t i = 0;
for (; i < j; s++)
{
c = *s;
printNumber((unsigned long)c, 8);
++i;
}
}

/**
* 主函数
*/
int main(int argc, char *argv[])
{
unsigned int length = 8;
char src[9] = "abcdefgh";
char dest[9] = "tttttttt"; //存放结果
unsigned long* srcLong = (unsigned long*)src;
unsigned long* destLong = (unsigned long*)dest;
//
unsigned long key1 = 0xaaaaaaaa; //1010....
unsigned long n;
//
printNumber(key1, 32); puts(":key1");
printString(src); puts(":src");


unsigned int count = length / 4;
unsigned int i;
for (i = 0; i < count; i++) //srcLong < endLong
{
n = (*srcLong) & key1;
memcpy((void *)destLong, (void *)&n, 4);
srcLong += 1;
destLong += 1;
}
printString(dest); puts(":dest");

return 0;
}
zgl7903 2018-08-08
  • 打赏
  • 举报
回复
因为是long 指针,所以+1就可以了
srcLong++; //srcLong += 4;
destLong++; //destLong +=4;

还要留意长度不能被4整除的情况

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧