pub fn to_hit_packet(self) -> u64 { let header = 0xB << 60; let toa = (self.toa % HIT_LIMIT) as u64; // get rollovers and convert to unsigned let (tot, col, row): (u64, u64, u64) = (self.tot.into(), self.col.into(), self.row.into()); let pix = ((col % 2) << 2) | (row % 4); // extract pix from row/col let col_bits: u64 = (col - (pix / 4)) << 52; // use pix to find col bits let row_bits: u64 = (row - (pix & 0x3)) << 45; // use pix to find row bits let tot_bits: u64 = ((tot / 25) % 1024) << 20; // 1024 is for large, clustered TOTs let global_time = toa / 409_600_000; // extract "coarse" toa from the global time let remainder = (toa % 409_600_000) / (25_000 / 16); let remainder = remainder - (remainder / 3125); // fix off-by-0.5 error (3125 = 1562.5 * 2) let fta_bit = (!remainder & 0xF) << 16; // extract fine bits let cta_bit = ((remainder & !0xF) >> 4) << 30; // extract course bits header | col_bits | row_bits | (pix << 44) | cta_bit | tot_bits | fta_bit | global_time }
时间: 2024-04-17 17:29:38 浏览: 159
这段代码定义了一个名为 `to_hit_packet` 的函数,用于生成一个 `u64` 类型的命中数据包。
函数内部进行了一系列的位运算和数值操作来计算出命中数据包的值。具体的计算步骤如下:
1. 创建一个 `header` 变量,将 0xB(11 的二进制表示)左移 60 位作为高位标识。
2. 将 `self.toa` 取余 `HIT_LIMIT`,并将结果转换为 `u64` 类型,用于处理溢出情况。
3. 将 `self.tot`、`self.col` 和 `self.row` 分别转换为 `u64` 类型。
4. 通过对 `col` 取余 2 和对 `row` 取余 4 的结果,将得到的像素值 `pix` 提取出来。
5. 根据 `pix` 的值,计算出列位数 `col_bits`(通过减去像素值除以 4)和行位数 `row_bits`(通过减去像素值与 0x3 的结果)。
6. 将 `tot` 除以 25 取余 1024 的结果左移 20 位,并赋给 `tot_bits`。
7. 将 `toa` 除以 409,600,000 得到 "coarse" toa 值,并赋给 `global_time`。
8. 计算余数 `remainder`,首先将 `toa` 对 409,600,000 取余,然后再除以 (25,000 / 16)。
9. 将 `remainder` 减去 `remainder` 除以 3,125 的结果,用于修正误差。
10. 将 `(!remainder & 0xF)` 左移 16 位,并赋给 `fta_bit`,用于提取细位。
11. 将 `((remainder & !0xF) >> 4)` 左移 30 位,并赋给 `cta_bit`,用于提取粗位。
12. 将 `header`、`col_bits`、`row_bits`、`(pix << 44)`、`cta_bit`、`tot_bits`、`fta_bit` 和 `global_time` 进行按位或操作,得到最终的命中数据包结果。
这段代码使用了位运算和数值操作来生成命中数据包的值,具体的计算逻辑可能与特定的应用场景和硬件相关。
阅读全文
相关推荐















