获取、设置、读取、按位转换为 C# 中的 Short 类型值
Get, Set, Read, converts bitwise in Short type value in C#
我有空值 X:
short X=1; //Result in binary: 0000000000000001
- 我需要将它们拆分成一个数组并设置位(比如第 6 位和第 10 位)//二进制结果:0000001000100001
- 我需要将它转换回短 X 值。
我怎样才能做到无痛?
你能帮忙吗?
如果你有一个 int 值 "intValue" 并且你想在位置 "bitPosition" 处设置一个特定位,请执行如下操作:
intValue = intValue | (1 << bitPosition);
或更短:
intValue |= 1 << bitPosition;
如果你想重置一点(即将其设置为零),你可以这样做:
intValue &= ~(1 << bitPosition);
(运算符 ~ 反转值中的每一位,因此 ~(1 << bitPosition) 将产生一个 int,其中除给定 bitPosition 处的位外,每个位都为 1。)
Linq 解决方案,更简洁,但可能不如 foreach
循环:
using System.Linq;
...
short X = 1;
var bitsToSet = new[] { 5, 9 };
var result = X | bitsToSet.Aggregate((s, a) => s |= 1 << a);
如果你坚持short
添加cast:
short result = (short) (X | bitsToSet.Aggregate((s, a) => s |= 1 << a));
1.手动解决
设置第 6 位和第 10 位:
myValue |= (1 << 6)|(1 << 10);
清除位 6 和 10:
myValue &= ~((1 << 6)|(1 << 10));
2。使用位数组
var bits = new BitArray(16); // 16 bits
bits[5] = true;
bits[10] = true;
转换回短:
var raw = new byte[2];
bits.CopyTo(raw, 0);
var asShort = BitConverter.ToInt16(raw, 0);
如果您指的是非常基本的加密,那么使用 XOR (^
) 运算符可能更适合您的需要。
short FlipBytes(short original, params int[] bytesToSet)
{
int key = 0;
foreach (int b in bytesToSet)
{
if (b >= 0 && b < 16)
{
key |= 1 << b;
}
}
return (short)(original ^ key);
}
此方法将设置和重置您想要的字节。例如:
short X = 1;
short XEncrypt = FlipBytes(X, 6, 10);
short XDecrypt = FlipBytes(XEncrypt, 6, 10);
// X = 1 , Binary = 0000000000000001
// XEncrypt = 1089 , Binary = 0000010001000001
// XDecrypt = 1 , Binary = 0000000000000001
我有空值 X:
short X=1; //Result in binary: 0000000000000001
- 我需要将它们拆分成一个数组并设置位(比如第 6 位和第 10 位)//二进制结果:0000001000100001
- 我需要将它转换回短 X 值。
我怎样才能做到无痛? 你能帮忙吗?
如果你有一个 int 值 "intValue" 并且你想在位置 "bitPosition" 处设置一个特定位,请执行如下操作:
intValue = intValue | (1 << bitPosition);
或更短:
intValue |= 1 << bitPosition;
如果你想重置一点(即将其设置为零),你可以这样做:
intValue &= ~(1 << bitPosition);
(运算符 ~ 反转值中的每一位,因此 ~(1 << bitPosition) 将产生一个 int,其中除给定 bitPosition 处的位外,每个位都为 1。)
Linq 解决方案,更简洁,但可能不如 foreach
循环:
using System.Linq;
...
short X = 1;
var bitsToSet = new[] { 5, 9 };
var result = X | bitsToSet.Aggregate((s, a) => s |= 1 << a);
如果你坚持short
添加cast:
short result = (short) (X | bitsToSet.Aggregate((s, a) => s |= 1 << a));
1.手动解决
设置第 6 位和第 10 位:
myValue |= (1 << 6)|(1 << 10);
清除位 6 和 10:
myValue &= ~((1 << 6)|(1 << 10));
2。使用位数组
var bits = new BitArray(16); // 16 bits
bits[5] = true;
bits[10] = true;
转换回短:
var raw = new byte[2];
bits.CopyTo(raw, 0);
var asShort = BitConverter.ToInt16(raw, 0);
如果您指的是非常基本的加密,那么使用 XOR (^
) 运算符可能更适合您的需要。
short FlipBytes(short original, params int[] bytesToSet)
{
int key = 0;
foreach (int b in bytesToSet)
{
if (b >= 0 && b < 16)
{
key |= 1 << b;
}
}
return (short)(original ^ key);
}
此方法将设置和重置您想要的字节。例如:
short X = 1;
short XEncrypt = FlipBytes(X, 6, 10);
short XDecrypt = FlipBytes(XEncrypt, 6, 10);
// X = 1 , Binary = 0000000000000001
// XEncrypt = 1089 , Binary = 0000010001000001
// XDecrypt = 1 , Binary = 0000000000000001