处理无符号整数
一个 无符号整数 (uinteger) 类型表示一个无符号的64位整数。
类型名称: uint
最小值: 0
最大值: 18446744073709551615
无符号整数语法
Flux 不提供无符号整数字面量语法。 但是,你可以使用 uint() 来 转换基本数据类型为无符号整数。
uint(v: 123)
// Returns 123 (uint)
将数据类型转换为无符号整数
- string: 返回数字字符串 (
[0-9]) 的无符号整型等价值 - 布尔值: 返回
1表示true或0表示false - duration: 返回持续时间中的纳秒数
- 时间: 返回等效的 纳秒纪元时间戳
- float: 将浮点值在小数点处截断并返回无符号整数等效值
- int: 返回整数的无符号整数等价值
uint(v: "123")
// 123
uint(v: true)
// Returns 1
uint(v: 1d3h24m)
// Returns 98640000000000
uint(v: 2021-01-01T00:00:00Z)
// Returns 1609459200000000000
uint(v: 12.54)
// Returns 12
uint(v: -54321)
// Returns 18446744073709497295
在转换为无符号整数之前舍入浮点值
在将 浮点数 转换为整数时,
uint() 截断 浮点值的小数部分(例如 12.54 转换为 12)。
您可能希望在转换之前将浮点值四舍五入到最接近的整数 (12.54 转换为 13)。
要做到这一点:
- 导入
math包。 - 使用
math.round()在将浮点值转换为无符号整数之前进行四舍五入。
import "math"
uint(v: math.round(x: 12.54))
// Returns 13
将十六进制字符串转换为无符号整数
将数字的十六进制字符串表示转换为无符号整数:
- 导入
contrib/bonitoo-io/hex包。 - 使用
hex.uint()将十六进制字符串转换为无符号整数。
import "contrib/bonitoo-io/hex"
hex.uint(v: "-1e240")
// Returns 123456
将列转换为无符号整数
Flux 允许你遍历 表流 中的行并将列转换为无符号整数。
要将 _value 列转换为无符号整数,请使用 toUInt() 函数。
toUInt() 仅对 _value 列进行操作。
data
|> toUInt()
给定以下输入数据:
| 时间 | 值 (浮动) |
|---|---|
| 2021-01-01T00:00:00Z | 1.23 |
| 2021-01-01T02:00:00Z | 4.56 |
| 2021-01-01T03:00:00Z | -7.89 |
| 2021-01-01T04:00:00Z | 10.11 |
上面的例子返回:
| _时间 | _值 (uint) |
|---|---|
| 2021-01-01T00:00:00Z | 1 |
| 2021-01-01T02:00:00Z | 4 |
| 2021-01-01T03:00:00Z | 18446744073709551609 |
| 2021-01-01T04:00:00Z | 10 |
将任何列转换为无符号整数:
data
|> map(fn: (r) => ({ r with uid: uint(v: r.uid) }))
给定以下输入数据:
| _时间 | 索引 (字符串) |
|---|---|
| 2021-01-01T00:00:00Z | 100010024 |
| 2021年01月01日T02:00:00Z | 100050213 |
| 2021-01-01T03:00:00Z | 200130763 |
| 2021-01-01T04:00:00Z | 101420099 |
上面的例子返回:
| 时间 | 索引 (uint) |
|---|---|
| 2021-01-01T00:00:00Z | 100010024 |
| 2021-01-01T02:00:00Z | 100050213 |
| 2021-01-01T03:00:00Z | 200130763 |
| 2021-01-01T04:00:00Z | 101420099 |
对无符号整数进行操作
对无符号整数执行算术运算
要执行像加、减、乘或除整数这样的操作,使用 Flux 算术运算符。 操作数必须是相同类型。 该操作返回一个整数。
当使用无符号整数操作数时,小数部分的结果会在小数点处被截断。
uint(v: 1) + uint(v: 45)
// Returns 46
uint(v: 1) - uint(v: 45)
// Returns 18446744073709551572
uint(v: 12) * uint(v: 100)
// Returns 1200
uint(v: 100) / uint(v: 200)
// Returns 0
uint(v: 10) ^ uint(v: 2)
// Returns 100
对无符号整数执行按位操作
使用experimental/bitwise 包对无符号整数执行按位操作。
import "experimental/bitwise"
bitwise.uand(a: uint(v: 12), b: uint(v: 21))
// Returns 4
bitwise.uor(a: uint(v: 12), b: uint(v: 21))
// Returns 29
bitwise.uxor(a: uint(v: 12), b: uint(v: 21))
// Returns 25
bitwise.uclear(a: uint(v: 12), b: uint(v: 21))
// Returns 8
bitwise.unot(a: uint(v: 12))
// Returns 18446744073709551603
bitwise.ulshift(a: uint(v: 12), b: uint(v: 21))
// Returns 25165824
bitwise.urshift(a: uint(v: 21), b: uint(v: 4))
// Returns 1
比较无符号整数
使用 Flux 比较运算符 来比较无符号整数。 操作数必须是相同类型。 该操作返回一个布尔值。
uint(v: 12345600) == uint(v: 12345601)
// Returns false
uint(v: 2) > uint(v: -2)
// Returns false