news 2026/9/17 22:43:16

StarRocks bit_shift_left 函数详解:算术左移的语法、边界行为与底层实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
StarRocks bit_shift_left 函数详解:算术左移的语法、边界行为与底层实现

StarRocks bit_shift_left 函数详解:算术左移的语法、边界行为与底层实现

【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks

bit_shift_left是 StarRocks 提供的位运算函数之一,用于将数值表达式的二进制表示按指定位数向左移动,实现高效的算术左移(arithmetic left shift)计算。本指南以官方函数参考文档为主体,结合 FE(Frontend)解析与 BE(Backend)执行两端的源码实现,完整讲解其语法、参数类型、返回值、边界规则与实战示例,帮助你准确理解位长度不变、低位补 0、高位保持等语义,并将其正确应用于权限掩码、状态标志位、哈希计算等场景。

功能概述

bit_shift_left(value, shift)value的二进制表示向左移动shift位。这是一个算术左移操作,其核心特征包括:

  • 位长度不变:移位过程不会改变二进制串的总位数,移出的高位直接丢弃;
  • 低位补 0:右端空出的低位统一补 0;
  • 高位保持原值:原有高位在丢弃后,其符号位含义不受影响。

例如,将二进制10101左移一位得到11010(等价于十进制21 → 42,即乘以 2)。

从源码结构看,该函数在 StarRocks 中归属于算术运算(Arithmetic)体系,与加、减、乘、除以及bitandbitorbitxorbitnot等位运算并列。在 BE 端实现中,BitShiftLeftOpBitShiftRightOpBitShiftRightLogicalOp一同被定义并注册为二进制运算算子,参见 be/src/exprs/arithmetic_operation.h;在 FE 端,FunctionSet中声明了BIT_SHIFT_LEFT = "bit_shift_left"等函数名常量,参见 fe/fe-core/src/main/java/com/starrocks/catalog/FunctionSet.java。

语法

bit_shift_left(value, shift)

该函数接受两个参数,返回移位后的结果。

参数说明

参数说明支持的数据类型
value待移位的数值或数值表达式TINYINT、SMALLINT、INT、BIGINT、LARGEINT
shift左移的位数BIGINT

返回值

返回与value相同类型的结果值。例如,value为 INT,返回类型即为 INT;value为 LARGEINT,则返回 LARGEINT。

使用说明与边界行为

  • NULL 传播:任一输入参数为 NULL,函数返回 NULL。
  • 负移位位数:若shift小于 0,返回 0。
  • 移位位数为 0:将value左移 0 位,结果恒为原value
  • 对 0 移位:将 0 左移任意位数,结果恒为 0。
  • 非整数数值类型:若value为数值类型但不是整数(如浮点数),会被强制转换为整数后再执行移位。参见 示例。
  • 字符串类型:若value为字符串,则尽可能转换为整数;若无法转换,则按 NULL 处理。参见 示例。

这些规则在 SQL 层保证了对异常输入的确定性输出,避免了移位位数为负、类型不匹配等场景下的未定义行为。

示例

以下示例均在 StarRocks 中执行并验证:

SELECT bit_shift_left(2, 1); +----------------------+ | bit_shift_left(2, 1) | +----------------------+ | 4 | +----------------------+

2的二进制表示为10,左移一位得到100,即十进制4

SELECT bit_shift_left(2.2, 1); +------------------------+ | bit_shift_left(2.2, 1) | +------------------------+ | 4 | +------------------------+

2.2先被转换为整数2,再左移一位得到4

SELECT bit_shift_left("2", 1); +------------------------+ | bit_shift_left('2', 1) | +------------------------+ | 4 | +------------------------+

字符串"2"可被转换为整数2,左移一位得到4

SELECT bit_shift_left(-2, 1); +-----------------------+ | bit_shift_left(-2, 1) | +-----------------------+ | -4 | +-----------------------+

负数同样支持算术左移:-2的二进制补码表示左移一位得到-4,等价于乘以 2。这印证了文档中"位长度不变、低位补 0"的算术左移语义——符号位不因移位而改变结果的符号。

实战场景:位掩码与标志位

bit_shift_left最常见的实战价值在于快速构造位掩码(bitmask)和状态标志位:

  • 构造权限掩码bit_shift_left(1, n)可生成第n位为 1 的掩码,例如bit_shift_left(1, 3)得到8(二进制1000),用于权限系统的位级授权判断。
  • 快速乘 2 的幂:左移一位等价于乘以 2,bit_shift_left(value, n)等价于value * 2^n,在需要以 2 的幂进行缩放时可替代乘法运算。
  • 与位运算函数配合:可与bitandbitor等函数组合使用,实现位字段的读写。相关函数文档位于同目录下的 bitand、bitor、bitnot 等。

底层实现原理

FE 端:函数注册与执行算子映射

从 FE 源码结构看,bit_shift_left的调用链完整覆盖了 SQL 解析、表达式构建与执行算子下发的各个环节:

  • 函数名注册FunctionSet中声明函数名常量BIT_SHIFT_LEFT,参见 fe/fe-core/src/main/java/com/starrocks/catalog/FunctionSet.java;
  • 表达式构建:在ScalarOperatorToExpr中,case "bit_shift_left"分支将其构建为ArithmeticExpr,并绑定ArithmeticExpr.Operator.BIT_SHIFT_LEFT,参见 fe/fe-core/src/main/java/com/starrocks/sql/plan/ScalarOperatorToExpr.java;
  • 算子下发ScalarOperatorToExecExpr通过buildArithmetic将其转换为执行表达式,参见 fe/fe-core/src/main/java/com/starrocks/sql/plan/ScalarOperatorToExecExpr.java;
  • Opcode 映射ExprOpcodeRegistryArithmeticExpr.Operator.BIT_SHIFT_LEFT映射为 thrift 层 opcodeTExprOpcode.BIT_SHIFT_LEFT,参见 fe/fe-core/src/main/java/com/starrocks/sql/expression/ExprOpcodeRegistry.java;
  • Decimal 类型限制DecimalV3FunctionAnalyzerBIT_SHIFT_LEFT归入不支持 Decimal 参数分析的函数集合,即该函数不接受 DECIMAL 类型直接参与,参见 fe/fe-core/src/main/java/com/starrocks/sql/analyzer/DecimalV3FunctionAnalyzer.java。

BE 端:算子定义与移位执行

BE 端将位运算统一实现在算术运算模板中:

  • 算子定义BitShiftLeftOp等结构体定义了移位算子,并通过TYPE_GUARD注册类型守卫,参见 be/src/exprs/arithmetic_operation.h;
  • 算子名称get_op_name模板函数返回"bit_shift_left"等可读名称,参见 be/src/exprs/arithmetic_operation.h;
  • 核心移位逻辑:在ArithmeticBinaryOperator::apply中,is_bit_shift_left_op<Op>分支直接执行 C++ 左移运算l << r,参见 be/src/exprs/arithmetic_operation.h。由于返回类型与value类型保持一致(ReturnType<Type, ResultType>约束),因此左移产生的溢出高位会被丢弃,符合文档所述"位长度不变"的语义。

与 Trino 函数的兼容映射

StarRocks 的 Trino 方言解析器将 Trino 的bitwise_left_shift函数自动转换为bit_shift_left,便于从 Trino 迁移 SQL 的用户无缝使用,参见 fe/fe-core/src/main/java/com/starrocks/connector/parser/trino/Trino2SRFunctionCallTransformer.java。

相关函数

  • bit_shift_right:算术右移,高位补符号位。
  • bit_shift_right_logical:逻辑右移,高位补 0。

三个移位函数在 BE 端共享同一套算术算子框架(见 be/src/exprs/arithmetic_operation.h),区别仅在于右移时是补符号位(算术右移)还是补 0(逻辑右移),而左移始终低位补 0,三者共同构成了完整的位级移位能力。

总结

bit_shift_left是 StarRocks 内置的算术左移位函数,支持 TINYINT 到 LARGEINT 的整数类型,并具备 NULL 传播、负位数返回 0、类型自动转换等明确边界规则。从源码层面看,其执行链路从 FE 的FunctionSet注册、ArithmeticExpr构建,到 BE 的BitShiftLeftOp模板实例化与 C++ 左移运算,完整闭环且与 Trino 方言兼容。在 SQL 中合理使用bit_shift_left,可以高效实现位掩码构造、乘以 2 的幂等运算,是 StarRocks 位运算能力中的重要一环。

【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 22:42:58

Windows Server 2012 R2企业运维实战:PowerShell自动化与AD域控精要

简介&#xff1a;本资源为《网络服务器配置与管理》课程配套教学大纲PDF&#xff0c;面向高职高专及本科院校网络工程、信息安全、系统运维等专业师生&#xff0c;聚焦Windows Server 2012 R2平台的实战化服务器部署与安全管控能力培养。大纲覆盖10大核心模块&#xff1a;从系统…

作者头像 李华
网站建设 2026/9/17 22:42:49

SQL Server附加数据库完全指南:从原理到5123错误解决

1. 附加数据库&#xff0c;先把原理和前提搞清楚先说结论&#xff1a;SQL Server 附加数据库&#xff0c;本质上就是把一个已有的数据库文件&#xff08;主要是 .mdf 数据文件&#xff0c;配合 .ldf 日志文件&#xff09;重新“挂载”到当前 SQL Server 实例上&#xff0c;让它…

作者头像 李华
网站建设 2026/9/17 22:39:14

统帅L1PB20/26壁挂炉说明书:拨码、PWM与Wi-Fi物联解析

简介&#xff1a;这份PDF文档是Leader统帅L1PB20-LC1(T)U1燃气采暖热水炉的官方使用说明书&#xff0c;面向已购买或即将安装该型号壁挂炉的家庭用户、安装维修技师及家电售后人员。内容围绕采暖与洗浴两用功能展开&#xff0c;涵盖产品结构图解、Wi-Fi物联与智能控制配网说明、…

作者头像 李华