Octave 提供了许多函数,用于对数值进行逐位操作。设置和获取单个位值的基本函数是 bitset 和 bitget。
B = bitset (A, n) ¶B = bitset (A, n, val) ¶对 A 中无符号整数的第 n 位进行设置或重置。
最低有效位对应 n = 1。val = 0 重置位,val = 1 设置位。如果未指定 val,则默认为 1(设置位)。所有输入必须具有相同的大小或为标量。
示例 1:设置多个位
x = bitset (1, 3:5)
⇒ x =
5 9 17
dec2bin (x)
⇒
00101
01001
10001
示例 2:重置和设置位
x = bitset ([15 14], 1, [0 1]) ⇒ x = 14 15
另请参阅: bitand、bitor、bitxor、bitget、bitcmp、bitshift、intmax、flintmax。
b = bitget (A, n) ¶返回 A 中无符号整数在第 n 位的位值。
最低有效位对应 n = 1。
bitget (100, 8:-1:1) ⇒ 0 1 1 0 0 1 0 0
另请参阅: bitand、bitor、bitxor、bitset、bitcmp、bitshift、intmax、flintmax。
Octave 所有位运算的参数都可以是标量或数组,但 bitcmp 的 k 参数必须为标量。当多个参数为数组时,所有参数必须具有相同的形状,并且按位运算符会分别应用于每个参数的对应元素。如果至少有一个参数是标量而另一个是数组,则标量参数会被复制扩展。因此
bitget (100, 8:-1:1)
等同于
bitget (100 * ones (1, 8), 8:-1:1)
需要注意的是,传递给 Octave 位操作函数的所有值都被视为整数。因此,尽管上面 bitset 的示例传递了浮点值 10,但它被当作比特位 [1, 0, 1, 0] 处理,而非 10 的原生浮点格式表示。
由于数字可表示的最大值对于位操作很重要,特别是在构造掩码时,Octave 提供了两个实用函数:flintmax(用于浮点整数)和 intmax(用于整数对象,如 uint8、int64 等)。
Octave 还包含基本的按位「与」、「或」和「异或」运算符。
z = bitand (x, y) ¶返回非负整数的按位 AND。
x、y 必须在 [0, intmax] 范围内。
另请参阅: bitor、bitxor、bitset、bitget、bitcmp、bitshift、intmax、flintmax。
z = bitor (x, y) ¶返回非负整数 x 和 y 的按位 OR。
另请参阅: bitor、bitxor、bitset、bitget、bitcmp、bitshift、intmax、flintmax。
z = bitxor (x, y) ¶返回非负整数 x 和 y 的按位 XOR。
另请参阅: bitand、bitor、bitset、bitget、bitcmp、bitshift、intmax、flintmax。
按位「not」运算符是一元运算符,对值的每一位执行逻辑取反。要使此操作有意义,必须定义对该值取反的掩码。Octave 的按位「not」运算符是 bitcmp。
C = bitcmp (A, k) ¶返回 A 中整数的 k 位补码。
如果省略 k,则使用 k = log2 (flintmax) + 1。
bitcmp (7,4) ⇒ 8 dec2bin (11) ⇒ 1011 dec2bin (bitcmp (11, 6)) ⇒ 110100
另请参阅: bitand、bitor、bitxor、bitset、bitget、bitcmp、bitshift、flintmax。
Octave 还支持按位左移和右移操作。
B = bitshift (A, k) ¶B = bitshift (A, k, n) ¶返回 A 中 n 位无符号整数的 k 位移位结果。
正数 k 表示左移;负数表示右移。
如果省略 n,则默认为 64。n 必须在 [1, 64] 范围内。
bitshift (eye (3), 1) ⇒
2 0 0 0 2 0 0 0 2
bitshift (10, [-2, -1, 0, 1, 2]) ⇒ 2 5 10 20 40
另请参阅: bitand、bitor、bitxor、bitset、bitget、bitcmp、intmax、flintmax。
从数值任一端移出的位将会丢失。Octave 还使用算术移位,即右移时保持数值的符号位。例如:
bitshift (-10, -1) ⇒ -5 bitshift (int8 (-1), -1) ⇒ -1
请注意,bitshift (int8 (-1), -1) 的结果是 -1,因为 -1 在 int8 数据类型中的二进制表示为 [1, 1, 1, 1, 1, 1, 1, 1]。
版权所有 © 2024-2026 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-4