4.5 位操作

Octave 提供了许多函数,用于对数值进行逐位操作。设置和获取单个位值的基本函数是 bitsetbitget

 
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

另请参阅: bitandbitorbitxorbitgetbitcmpbitshiftintmaxflintmax

 
b = bitget (A, n)

返回 A 中无符号整数在第 n 位的位值。

最低有效位对应 n = 1。

bitget (100, 8:-1:1)
⇒  0  1  1  0  0  1  0  0

另请参阅: bitandbitorbitxorbitsetbitcmpbitshiftintmaxflintmax

Octave 所有位运算的参数都可以是标量或数组,但 bitcmpk 参数必须为标量。当多个参数为数组时,所有参数必须具有相同的形状,并且按位运算符会分别应用于每个参数的对应元素。如果至少有一个参数是标量而另一个是数组,则标量参数会被复制扩展。因此

bitget (100, 8:-1:1)

等同于

bitget (100 * ones (1, 8), 8:-1:1)

需要注意的是,传递给 Octave 位操作函数的所有值都被视为整数。因此,尽管上面 bitset 的示例传递了浮点值 10,但它被当作比特位 [1, 0, 1, 0] 处理,而非 10 的原生浮点格式表示。

由于数字可表示的最大值对于位操作很重要,特别是在构造掩码时,Octave 提供了两个实用函数:flintmax(用于浮点整数)和 intmax(用于整数对象,如 uint8int64 等)。

Octave 还包含基本的按位「与」、「或」和「异或」运算符。

 
z = bitand (x, y)

返回非负整数的按位 AND。

xy 必须在 [0, intmax] 范围内。

另请参阅: bitorbitxorbitsetbitgetbitcmpbitshiftintmaxflintmax

 
z = bitor (x, y)

返回非负整数 xy 的按位 OR。

另请参阅: bitorbitxorbitsetbitgetbitcmpbitshiftintmaxflintmax

 
z = bitxor (x, y)

返回非负整数 xy 的按位 XOR。

另请参阅: bitandbitorbitsetbitgetbitcmpbitshiftintmaxflintmax

按位「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

另请参阅: bitandbitorbitxorbitsetbitgetbitcmpbitshiftflintmax

Octave 还支持按位左移和右移操作。

 
B = bitshift (A, k)
B = bitshift (A, k, n)

返回 An 位无符号整数的 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

另请参阅: bitandbitorbitxorbitsetbitgetbitcmpintmaxflintmax

从数值任一端移出的位将会丢失。Octave 还使用算术移位,即右移时保持数值的符号位。例如:

bitshift (-10, -1)
⇒  -5
bitshift (int8 (-1), -1)
⇒  -1

请注意,bitshift (int8 (-1), -1) 的结果是 -1,因为 -1int8 数据类型中的二进制表示为 [1, 1, 1, 1, 1, 1, 1, 1]


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-4