bitwise_left_shift

paddle. bitwise_left_shift ( x, y, is_arithmetic=True, out=None, name=None ) [源代码]

对 Tensor xy 逐元素进行 按位算术(或逻辑)左移 运算。

关于 有符号数的符号位 在不同情景下的行为:
  1. 算术左移时,符号位同其他位一样,一起左移,右边补 0;

  2. 逻辑左移时,符号位同其他位一样,一起左移,右边补 0;

  3. 算术右移时,符号位同其他位一样,一起右移,左边补符号位;

  4. 逻辑右移时,符号位同其他位一样,一起右移,左边补 0;

注解

当有符号数左移发生溢出时,其值不可控,可能会在左移时突然变号,这是因为在左移时,有符号数的符号位同样进行左移,会导致符号位右侧的值不断成为符号位,例如

example1:

int8_t x = -45; // 补码为 1101,0011      表示-45

int8_t y = x << 2;   //补码为 0100,1100  表示 76

int8_t z = x << 3;   //补码为 1001,1000  表示-104

example2:

int8_t x = -86; // 补码为 1010,1010      表示-86

int8_t y = x << 1;   //补码为 0101,0100  表示 84

int8_t z = x << 2;   //补码为 1010,1000  表示-88

以上为溢出导致的符号突变。

\[Out = X \ll Y\]

注解

paddle.bitwise_left_shift 遵守 broadcasting,如您想了解更多,请参见 Tensor 介绍 .

参数

  • x (Tensor)- 输入的 N-D Tensor,数据类型为:uint8,int8,int16,int32,int64。

  • y (Tensor)- 输入的 N-D Tensor,数据类型为:uint8,int8,int16,int32,int64。

  • is_arithmetic (bool) - 用于表明是否执行算术位移,True 表示算术位移,False 表示逻辑位移。默认值为 True,表示算术位移。

  • out (Tensor,可选)- 输出的结果 Tensor,是与输入数据类型相同的 N-D Tensor。默认值为 None,此时将创建新的 Tensor 来保存输出结果。

  • name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。

返回

按位算术(逻辑)左移 运算后的结果 Tensor,数据类型与 x 相同。

代码示例 1

算术左移

 >>> import paddle
 >>> x = paddle.to_tensor([[1,2,4,8],[16,17,32,65]])
 >>> y = paddle.to_tensor([[1,2,3,4,], [2,3,2,1]])
 >>> paddle.bitwise_left_shift(x, y, is_arithmetic=True)
 Tensor(shape=[2, 4], dtype=int64, place=Place(gpu:0), stop_gradient=True,
        [[2  , 8  , 32 , 128],
         [64 , 136, 128, 130]])

代码示例 2

逻辑左移

 >>> import paddle
 >>> x = paddle.to_tensor([[1,2,4,8],[16,17,32,65]])
 >>> y = paddle.to_tensor([[1,2,3,4,], [2,3,2,1]])
 >>> paddle.bitwise_left_shift(x, y, is_arithmetic=False)
 Tensor(shape=[2, 4], dtype=int64, place=Place(gpu:0), stop_gradient=True,
     [[2  , 8  , 32 , 128],
         [64 , 136, 128, 130]])