如何使用位运算符在TSQL中翻转整数的某一位?

4

在SQL中,我有一个标志列,它是一个整数。

我需要使用SQL语句设置标志中的位。相应的C ++语句看起来像 flags&= ~(unsigned long)(0x10000000)

我尝试了以下操作:

update [Databases]
 set flags = flags & ~0x10000000

但我遇到了一个问题。
Operand data type varbinary is invalid for '~' operator.

然后我尝试查看转换函数会产生什么结果。
select flagInt = CONVERT(int , 0x10000000)

这段代码给我返回了 268435456。

select flagIntInvert = ~CONVERT(int , 0x10000000)

给我返回了 -268435457

与带符号的整数相同。

flag    268435456   int
        ~flag   -268435457  int

然而,我需要未签名版本。
(uint32)flag    268435456   unsigned long
~(uint32)flag   4026531839  unsigned long

有没有一种方法可以将标记设置为0x10000000的反转?谢谢。

更新 [数据库] 设置标志 = 标志 ^ 268435456 怎么样? - attila
不确定这是否有帮助,但也许可以看看这个链接:http://www.julian-kuiters.id.au/article.php/sqlserver2005-unsigned-integer - Stuart Ainsworth
位取反在SQL中的表示是~,但你的问题似乎更多与有符号/无符号整数相关,而不是位运算。然而,我认为对于你来说,更快的方法可能是编写一个小应用程序,通过代码获取、更新和保存值,因为如上面的评论所示 - 如果你想使用无符号值,你将不得不制作自己的类型(或者使用BIGINT并重新设计逻辑)。 - Allan S. Hansen
1个回答

4

可以使用按位非运算符~来设置标志的反转。在SQL Server中,int是带符号的。

从我所看到的情况来看,您想激活整数中的一个位,这可以使用以下语句完成。

假设您有一个值为1的整数,即第一个位是激活状态。

DECLARE @Value int = 1;

如果你想激活第三位,你可以使用或运算符(|)如下:

SET @Value = @Value | 4;

这将呈现 int 变量的值 5。
SELECT @Value;

如果您想检查第三位是否已设置,则可以使用以下内容,它将过滤所有其他活动位:
SELECT @Value & 4

如果你想用它进行比较,请使用以下语句:

IF @Value & 4 = 4 ...

希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接