编程论坛
注册
登录
编程论坛
→
C语言论坛
c语言中数据运算和符号的问题((i0>>0&0x1)*2-1)
zzmx
发布于 2020-09-28 10:02, 1733 次点击
最近在学习前辈们写的数据分析程序,有几个地方看不懂。
这是其中的一行程序
xx[
0
]=
2.0
*(wire[
0
+off][i1]-
4.25
)+((i0>>
0
&
0x1
)*
2
-
1
)*drft[
0
];
我主要是((i0>>0&0x1)*2-1)看不懂是什么意思,或许这是某种运算的法则?
还请知道的人指点一下,谢谢!
4 回复
#2
纯蓝之刃
2020-09-28 10:08
我也没看明白什么意思。((i0>>0&0x1)*2-1),首先i0>>0,i0右移0位,实际没改变,然后&0x1,取i0>>0后的数的最低位,然后运算后的值*2-1.实际上((i0>>0&0x1)*2-1)可以等价于(i0&0x01)。
我是这么认为的。不知道是否有其他含义。
#3
zzmx
2020-09-28 10:14
回复 2楼 纯蓝之刃
你好,这一段的代码是这样的,i0是一个十进制数。它右移0位变成什么呢?
程序代码:
for
(Int_t i0=
0
;i0<
16
;i0++){
xx[
0
]=
2.0
*(wire[
0
+off][i1]-
4.25
)+((i0>>
0
&
0x1
)*
2
-
1
)*drft[
0
];
xx[
1
]=
2.0
*(wire[
1
+off][i2]-
4.75
)-((i0>>
1
&
0x1
)*
2
-
1
)*drft[
1
];
xx[
2
]=
2.0
*(wire[
2
+off][i3]-
4.25
)+((i0>>
2
&
0x1
)*
2
-
1
)*drft[
2
];
xx[
3
]=
2.0
*(wire[
3
+off][i4]-
4.75
)-((i0>>
3
&
0x1
)*
2
-
1
)*drft[
3
];}
这只是其中一小段代码,后面还有其他运算。
#4
nosnoy
2020-09-28 14:57
回复 3楼 zzmx
右移0位就是不变,无论你是啥进制,电脑的移位操作只限于2进制,因为你的任何数据在底层都是以二进制存储的。
#5
nosnoy
2020-09-28 15:05
回复 3楼 zzmx
i0 0 1 2 3 4 5 6 7 8 9
i0 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
i0>>0 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09
i0>>1 0x00 0x00 0x01 0x01 0x02 0x02 0x03 0x03 0x04 0x04
i0>>0&0x1 0x00 0x00 0x01 0x01 0x00 0x00 0x01 0x01 0x00 0x00
((i0>>0&0x1)*2-1) -1 -1 1 1 -1 -1 1 1 -1 -1
1