OpenEdv-开源电子网

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

关于字节运算,能用2进制直接进行运算吗?

[复制链接]

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-4-29
在线时间
12 小时
发表于 2019-12-5 19:54:44 | 显示全部楼层 |阅读模式
1金钱
老哥们,本人基础一般,关于字节运算,我知道可以用16进制或者10进制直接运算,但是2进制能够直接运算吗?
例如
a=0x0A;   
b=0x25;
c=a+b;
这样c就是0x2F,也就是00101111
或者
a=10;
b=37;
c=a+b;
这样c就是47,也就是00101111
但是有没有办法
a=00001010;
b=00100101;
c=a+b;
也就是c=00101111
翻了各种资料,都没有找到能直接用2进制写的,还是说就是不能这样写,
只能用16进制或者10进制去运算,如果需要2进制输出显示的,就把运算结果放在数组里,然后一位一位输出?

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

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-12-5 22:26:32 | 显示全部楼层
理论上二进制也是可以的
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

51

主题

2165

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10652
金钱
10652
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-12-5 22:44:26 | 显示全部楼层
#define LongToBin8(n)((n>>21 & 0x80)   | (n>>18 & 0x40)   | (n>>15 & 0x20)   | (n>>12 & 0x10)   | (n>> 9 & 0x08)   | (n>> 6 & 0x04)   | (n>> 3 & 0x02)   | (n     & 0x01))
#define bin8(n) (u8)LongToBin8(0x##n##l)

c=bin8(00001010)+bin8(00100101);
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2019-12-6 08:04:57 | 显示全部楼层
额,其实在计算机或者说单片机内部,本质都二进制,写成十进制或十六进制只是方便人看,你写二进制也一样,不过前面得加0b,不过建议没必要这样
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2019-12-6 08:28:59 | 显示全部楼层
看多了,十六进制与二进制差不多
一位对4bit
十六进制就是二进制到缩写
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-4-29
在线时间
12 小时
 楼主| 发表于 2019-12-6 08:42:07 | 显示全部楼层
1208 发表于 2019-12-5 22:26
理论上二进制也是可以的

只是理论上吗?老哥有没有写过,或者看到过。
如果需要专门写个函数,那还是直接用16进制或者10进制来算方便,不是吗?
回复

使用道具 举报

0

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2019-12-3
在线时间
27 小时
发表于 2019-12-6 09:13:07 | 显示全部楼层
本帖最后由 M8Sh0tn0 于 2019-12-6 09:34 编辑
1208 发表于 2019-12-5 22:26
理论上二进制也是可以的
CPU实际上只能进行二进制的计算.

回复

使用道具 举报

0

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2019-12-3
在线时间
27 小时
发表于 2019-12-6 09:34:01 | 显示全部楼层

CPU实际上只能进行二进制的计算.

a=00001010;
b=00100101;

这并不是二进制表示
而是十进制表示
a=1010;(壹千零壹拾)
b=100101;

正确的二进制表示如下:
a=0b00001010;
b=0b00100101;
回复

使用道具 举报

10

主题

277

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2072
金钱
2072
注册时间
2016-8-15
在线时间
413 小时
发表于 2019-12-6 10:13:54 | 显示全部楼层
可以的,编译器会进行转换的
我的简书:https://www.jianshu.com/u/3e9efbf4a8c2
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-4-29
在线时间
12 小时
 楼主| 发表于 2019-12-6 10:19:25 | 显示全部楼层
M8Sh0tn0 发表于 2019-12-6 09:34
CPU实际上只能进行二进制的计算.

a=00001010;

对对,我就是想要这样的一种显示状态
那么,如果串口要用二进制的形式来输出,就还是只能放在一个数组里面才行吧
回复

使用道具 举报

28

主题

294

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1790
金钱
1790
注册时间
2018-3-26
在线时间
294 小时
发表于 2019-12-6 10:21:28 | 显示全部楼层
本帖最后由 htao 于 2019-12-6 10:22 编辑
o丷o 发表于 2019-12-6 10:19
对对,我就是想要这样的一种显示状态
那么,如果串口要用二进制的形式来输出,就还是只能放在一个数组里 ...

二进制打印, printf("a = %X",a); 输出8位二进制不足加0,printf("a = %08X",a);
茵茵猪头
回复

使用道具 举报

0

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2019-12-3
在线时间
27 小时
发表于 2019-12-6 10:29:25 | 显示全部楼层
o丷o 发表于 2019-12-6 10:19
对对,我就是想要这样的一种显示状态
那么,如果串口要用二进制的形式来输出,就还是只能放在一个数组里 ...

串口的输出从来就是二进制(更广泛地说计算机的硬件输出从来都是二进制的),不太清楚你要的是什么功能.如果要串口输出数据的话,直接向串口的数据输出寄存器写相应的数据就可以了.硬件会自动输出到串口线上的.
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-4-29
在线时间
12 小时
 楼主| 发表于 2019-12-6 10:55:45 | 显示全部楼层
M8Sh0tn0 发表于 2019-12-6 10:29
串口的输出从来就是二进制(更广泛地说计算机的硬件输出从来都是二进制的),不太清楚你要的是什么功能.如果 ...

我的意思是,一个数要在串口助手上以二进制显示
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-4-29
在线时间
12 小时
 楼主| 发表于 2019-12-6 10:57:42 | 显示全部楼层
htao 发表于 2019-12-6 10:21
二进制打印, printf("a = %X",a); 输出8位二进制不足加0,printf("a = %08X",a);

%X不是16进制吗
回复

使用道具 举报

0

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2019-12-3
在线时间
27 小时
发表于 2019-12-6 11:00:20 | 显示全部楼层
o丷o 发表于 2019-12-6 10:55
我的意思是,一个数要在串口助手上以二进制显示

设置串口助手的显示方式即可
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-4-29
在线时间
12 小时
 楼主| 发表于 2019-12-6 11:03:02 | 显示全部楼层
M8Sh0tn0 发表于 2019-12-6 10:29
串口的输出从来就是二进制(更广泛地说计算机的硬件输出从来都是二进制的),不太清楚你要的是什么功能.如果 ...

是不是无论是串口通信,或者其他通信协议,上位机接收到的数据都是二进制的
只是为了让人看,所以有了printf中的%d是显示十进制,%x显示的是十六进制
串口单纯发数据,其实压根不用去考虑把它转换成什么进制的,直接用输出寄存器发出去就完事了
是这样理解吗?
回复

使用道具 举报

0

主题

70

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2019-12-3
在线时间
27 小时
发表于 2019-12-6 11:21:17 | 显示全部楼层
o丷o 发表于 2019-12-6 11:03
是不是无论是串口通信,或者其他通信协议,上位机接收到的数据都是二进制的
只是为了让人看,所以有了pr ...

是的,硬件不知道数据的含义,只管接收或发送.数据的含义由软件来定义或解释
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2019-12-6 11:31:40 | 显示全部楼层
printf函数没有输出二进制功能,如果要显示二进制数,就自己写个方法把要显示的数据转换成8个字符型的0或者1输出就行了。
回复

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-4-29
在线时间
12 小时
 楼主| 发表于 2019-12-6 11:52:35 | 显示全部楼层
M8Sh0tn0 发表于 2019-12-6 11:21
是的,硬件不知道数据的含义,只管接收或发送.数据的含义由软件来定义或解释

ok,这样就好弄了,是我想太多了。
万分感谢
回复

使用道具 举报

37

主题

595

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1572
金钱
1572
注册时间
2017-7-17
在线时间
308 小时
发表于 2019-12-6 12:27:50 | 显示全部楼层
同一个数,进制只是表示方式,运算跟使用什么进制没有关系,只跟那个数有关系。比如10+10,你可以写成0x0a+0x0a,10+0x0a,10+0b1010, 0x0a+0b1010,但是都是一样的。就比如,你是你,对你爸而言,你是儿子,对你爷爷而言你是孙子,但是都是你。你妈叫你的时候,可以直接叫你,也可以叫他爸的儿子,也可以叫他爷爷的孙子,但实际上都是你,跟你妈叫你什么没有关系。满意请采纳。
回复

使用道具 举报

37

主题

595

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1572
金钱
1572
注册时间
2017-7-17
在线时间
308 小时
发表于 2023-4-7 21:21:04 | 显示全部楼层
C语言不支持将数写成二进制形式,比如对于十(10)这个数,你可以写十六进制形式0x0A,也可以直接写成十进制的10,就是不能写0b1010。printf里面也没有二进制数显示的控制符,所以如果要实现二进制形式的打印效果,就要自己写一个函数来实现。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 11:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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