注册 登录
编程论坛 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
zzmx2020-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
nosnoy2020-09-28 14:57
回复 3楼 zzmx
右移0位就是不变,无论你是啥进制,电脑的移位操作只限于2进制,因为你的任何数据在底层都是以二进制存储的。
#5
nosnoy2020-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