【问题标题】:128 bit Int in SQL Server 2012?SQL Server 2012 中的 128 位整数?
【发布时间】:2014-12-05 05:26:08
【问题描述】:

我正在寻找在 SQL Server 中实现 128 位无符号整数的最佳方法。主要要求是它必须支持所有 128 位的按位运算。 (理论上这在 64 位机器上是否可行?我跑题了。)

我通过 CLR 程序集了解了一些使用 C# 和用户定义类型的实现,但我无法确定它是否支持按位运算。

有没有人成功地完成了我需要做的事情?任何投入将不胜感激。谢谢!!

【问题讨论】:

  • 我意识到这个问题已经有将近 5 年的历史了;然而,至于“理论上可能在 64 位机器上”,答案是 - 当然。在大多数处理器上,您可以“带进位”进行移位和/或算术运算。例如,在具有此功能的 8 位处理器上(甚至在 Commodore 64 使用的 6502 上),任何溢出都会进入“进位”位,该位可能会影响下一个字节的操作。因此,在 8 位架构上进行 128 位算术是可能的,尽管几乎完全来自汇编语言(大多数高级语言不知道进位)

标签: c# sql-server int 128-bit bit-manipulation


【解决方案1】:

数据库方面,我会使用binary[16] 列。

然后在 clr 代码代码中,您可以在自定义类型中重载位运算符:

public struct My128BitValue
{
    private readonly long _l1;
    private readonly long _l2;

    public My128BitValue(long l1, long l2)
    {
        _l1 = l1;
        _l2 = l2;
    }

    public static My128BitValue operator &(My128BitValue left, My128BitValue right)
    {
        return new My128BitValue(left._l1 & right._l1, left._l2 & right._l2);
    }

    public static My128BitValue operator |(My128BitValue left, My128BitValue right)
    {
        return new My128BitValue(left._l1 | right._l1, left._l2 | right._l2);
    }

    public static My128BitValue operator ^(My128BitValue left, My128BitValue right)
    {
        return new My128BitValue(left._l1 ^ right._l1, left._l2 ^ right._l2);
    }
}

这里是CLR基础示例,需要完成FromByteArrayToByteArray方法:

using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{    
    [SqlFunction()]
    public static SqlBinary bitwiseAnd128Bit(SqlBinary lhs, SqlBinary rhs)
    {
        My128BitValue v1 = My128BitValue.FromByteArray((byte[])lhs); //explicit conversion
        My128BitValue v2 = My128BitValue.FromByteArray((byte[])rhs);
        My128BitValue result = v1 & v2;
        return result.ToByteArray(); //implicit conversion
    }
}

然后您可以在 SQL 中在两列上运行 bitwiseAnd128Bit

在此处阅读有关 CLR 的更多信息http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.90).aspx

【讨论】:

  • 不是真的“没问题”。其中一个操作数必须是 int,因此在第四个字节之外(如果bigint 也有效,则在第 8 个字节之外)进行按位运算并不直接
  • 这是一个有趣的方法。我会试一试。您能否举例说明如何在 SQL 中声明和使用 My128BitValue 变量(在实现 CLR 之后)?
  • @ambient 添加示例。
  • 韦斯顿 - 刚刚回到这个问题上。该解决方案效果很好,并且非常易于实施。实际上,我发现它也是一个非常优雅和创造性的解决方案。谢谢!
猜你喜欢
  • 2011-09-03
  • 1970-01-01
  • 2015-11-28
  • 1970-01-01
  • 2013-08-28
  • 2013-04-11
  • 2016-01-28
相关资源
最近更新 更多