【问题标题】:Bitwise operation with TSQL like rotation, selective bit inversion使用 TSQL 进行位操作,如旋转、选择性位反转
【发布时间】:2023-03-02 22:21:01
【问题描述】:

如何使用 TSQL 进行位运算。

我想向左移动 1 位。最左边的位也应该变成最右边的位。

Eg1:
Declare @a tinyint = 15
--Which is equal to 0000 1111

I need the result to be 30
--Which is equal to 0001 1110

Eg2:
Declare @a tinyint = 16
--Which is equal to 0001 0000

I need the result to be 32
--Which is equal to 0010 0000

或者选择性地反转一点。例如这里反转第 3 位位置

input:  0011 0010
result: 0011 1010

为了便于理解,我以二进制形式显示了输入,实际上输入必须是 int 类型。比如 0001 0000 代表 16。

【问题讨论】:

  • “最左边的位也应该变成最右边的位。”所以你想旋转位?
  • 为什么不直接乘以 2? a = a * 2;
  • @DmitryBychenko,所有情况都可以吗?
  • @Jithin:如果位为 1,则可能是溢出,例如“1000 0000”

标签: sql-server tsql sql-server-2012 boolean-operations boolean-algebra


【解决方案1】:

您可以使用^ (exclusive or) 来翻转一下。例如:

set @input = 15
set @bit = 4
set @result = @input ^ power(2, @bit - 1)

在二进制系统中,乘以 2 会将所有位左移一位。因此,您可以通过移位实现 1 位旋转,然后手动将最高位传送到最低位:

set @input = 128
set @result = 
    case 
    when @input & 128 > 0 then (@input ^ 128) * 2 + 1
    else @input * 2  
    end

Examples at SQL Fiddle.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多