OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5250|回复: 8

C语言中颠倒字符的高低位

[复制链接]

11

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2017-5-17
在线时间
46 小时
发表于 2017-12-6 09:49:49 | 显示全部楼层 |阅读模式
1金钱
在Microsoft Visual C++中,我输入一个字符,假如输入的字符转换成二进制是10110101,一条语句就能将他转换成01001010.换句话说,就是一条语句,可将51单片机的P1^0至P^7位高低位的状态互换。

一灯大师
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2017-12-6 10:05:54 | 显示全部楼层
10110101到01001010不是颠倒字符的高低位哦,是取反。。。不知道你想要什么哦。

~(10110101)=01001010
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2017-12-6 10:08:14 | 显示全部楼层
参考这篇CSDN博客:

http://blog.csdn.net/uncle_guo/article/details/42574705


博主的第一二种方法差不多,都是采用取某个位然后倒序存放的思想;第三种方法是提前计算好每个数字节倒序的结果,使用的时候直接查表即可。

如果要求速度快的话,建议使用第三种方法。
补充,C语言中没有这样的语句来实现楼主所说的功能。51的汇编语言中,也没有类似的指令。
十六进制带我飞。
回复

使用道具 举报

11

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2017-5-17
在线时间
46 小时
 楼主| 发表于 2017-12-6 18:09:34 | 显示全部楼层
BMN李 发表于 2017-12-6 10:05
10110101到01001010不是颠倒字符的高低位哦,是取反。。。不知道你想要什么哦。

~(10110101)=01001010

是P1^0和P1^7电平互换,P1^1和P1^6电平互换,P1^2和P1^5电平互换,,,。。。
一灯大师
回复

使用道具 举报

11

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2017-5-17
在线时间
46 小时
 楼主| 发表于 2017-12-6 18:12:40 | 显示全部楼层
BMN李 发表于 2017-12-6 10:05
10110101到01001010不是颠倒字符的高低位哦,是取反。。。不知道你想要什么哦。

~(10110101)=01001010

我当时打错字了,是一组io口的高位和地位的电平状态互换
一灯大师
回复

使用道具 举报

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
948
金钱
948
注册时间
2022-4-20
在线时间
356 小时
发表于 2022-6-28 18:04:05 | 显示全部楼层
   l=0;//这个是你最后的输出
   j=a;//这个是你要互换的值
   for(k=0;k<8;k++)
   {
    l<<=1;
    if(j&0x01)l++;
    j>>=1;
   }
最后把l的值赋给P1就可以了,我前几天自己写的,有点笨拙
又菜又爱指点
回复

使用道具 举报

0

主题

15

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-27
在线时间
4 小时
发表于 2022-7-16 17:11:36 | 显示全部楼层
本帖最后由 suiyuan57 于 2022-7-16 17:14 编辑

抄一个博主的算法,看一看

unsigned char shift_fun2(unsigned char data) {         data=(data<<4)|(data>>4);      
data=((data<<2)&0xcc)|((data>>2)&0x33);      
data=((data<<1)&0xaa)|((data>>1)&0x55);     
printf("  after shift fun2 data=%x \n",data);      
return data;
}

可以做一下执行演算:
假设原始位序列为 0 1 0 1 1 0 0 1

data=(data<<4)|(data>>4);之后序列为 1 0 0 1 0 1 0 1

data=((data<<2)&0xcc)|((data>>2)&0x33); 之后序列为 0 1 1 0 0 1 0 1
data=((data<<1)&0xaa)|((data>>1)&0x55); 之后序列为 1 0 0 1 1 0 1 0
————————————————
版权声明:本文为CSDN博主「小熊coder」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41854911/article/details/117390949

回复

使用道具 举报

0

主题

15

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-27
在线时间
4 小时
发表于 2022-7-16 17:16:10 | 显示全部楼层
抄一个博主的


unsigned char shift_fun2(unsigned char data)
{
        data=(data<<4)|(data>>4);
        data=((data<<2)&0xcc)|((data>>2)&0x33);
        data=((data<<1)&0xaa)|((data>>1)&0x55);
        printf("  after shift fun2 data=%x \n",data);
        return data;
}




我们可以做一下执行演算:
假设原始位序列为 0 1 0 1 1 0 0 1

data=(data<<4)|(data>>4);之后序列为 1 0 0 1 0 1 0 1

data=((data<<2)&0xcc)|((data>>2)&0x33); 之后序列为 0 1 1 0 0 1 0 1
data=((data<<1)&0xaa)|((data>>1)&0x55); 之后序列为 1 0 0 1 1 0 1 0
————————————————
版权声明:本文为CSDN博主「小熊coder」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_41854911/article/details/117390949
回复

使用道具 举报

0

主题

15

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-4-27
在线时间
4 小时
发表于 2022-7-16 17:16:51 | 显示全部楼层
unsigned char shift_fun2(unsigned char data) {         data=(data<<4)|(data>>4);         data=((data<<2)&0xcc)|((data>>2)&0x33);         data=((data<<1)&0xaa)|((data>>1)&0x55);         printf("  after shift fun2 data=%x \n",data);         return data; }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 10:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表