采取以下代码:
Declare @a integer
set @a = 0
set @a = @a | cast (1 as BINARy)
set @a = @a | cast (100 as BINARy)
select cast (@a as integer)
现在,这段代码的输出不应该是 5 吗?
我有一个整数,将它设置为 0,所以在二进制中它全是 0
然后我OR
用 1 ,所以它变成 0..001
然后我OR
用二进制的 100,所以它应该变成 00..0101,十进制是 5
我实际得到的输出是 101
编辑:为了更清楚起见,我试图用 TSQL 完成以下代码在 C++ 中的作用
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int a;
a = 0;
a = a | 1;
cout<< a;
a = a | 0b100;
cout<<endl<<a;
}
你的演员没有按照你认为应该的方式去做。
select cast(cast(100 as binary) as int)
等于 100。换句话说,您将十进制值 100 转换为二进制,而不是采用 base-2 表示法中的“100”。你的期望实际上是这样的:
顺便说一句,如果这是新开发的,我强烈建议不要在 SQL Server 中进行位移。它很慢,难以维护,并且违反了第一范式。如果不是,我猜你可能已经知道了……
要将二进制转换为十进制,您可以创建一个函数。从整数到显示 base-2 notation有其他方法,但这感觉会很慢。