C# 获取、设置、读取、按位转换C中的短类型值#
我有一个短值X:C# 获取、设置、读取、按位转换C中的短类型值#,c#,bit-manipulation,bitwise-operators,bit-shift,bitwise-and,C#,Bit Manipulation,Bitwise Operators,Bit Shift,Bitwise And,我有一个短值X: short X=1; //Result in binary: 0000000000000001 我需要将它们拆分成一个数组并设置位(比如位6和位10)//结果为二进制:000000100001 我需要把它转换回短X值 我怎样才能无痛地做这件事? 您能帮忙吗?如果您有一个int值“intValue”,并且您想在“bitPosition”位置设置一个特定的位,请执行以下操作: intValue=intValue |(1Linq解决方案,简洁,但可能不如foreachloop可
short X=1; //Result in binary: 0000000000000001
intValue=intValue |(1Linq解决方案,简洁,但可能不如foreach
loop可读:
using System.Linq;
...
short X = 1;
var bitsToSet = new[] { 5, 9 };
var result = X | bitsToSet.Aggregate((s, a) => s |= 1 << a);
1.手动解决方案
设置第6位和第10位:
myValue |= (1 << 6)|(1 << 10);
myValue &= ~((1 << 6)|(1 << 10));
转换回短字符:
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);
}
设置位是一个非常简单的过程,但我看不到在之后检索原始短值背后的模式(除非您总是设置第6位和第10位)。我也不确定“将它们拆分为一个数组”是什么意思。拆分为数组只是一个建议。你有没有一个好的解决方法?我是新手。你是否需要能够将更改后的短码转换回原始短码?这可以通过使用Aggregate
的重载和将X
设置为初始种子来简化。例如bitsToSet。骨料(X,(s,a)=>s|=1@Abion47:X
是short
类型,当1@MongZhu我设置位6和10,如果第一位被视为位0。大概,OP将他的第一位视为位1。不管怎样,这是他给出的一个示例,而不是要求。这仍然完成了他需要的工作。@MongZhu我会说位通常是标记为起始位0,因为它与它们所表示的2的幂对齐(即2^0=1、2^1=2、2^2=4等)。@Abion47好的,您是对的,位的编号从零开始,因此OP将其编号为错误的,与预期输出相比。
var raw = new byte[2];
bits.CopyTo(raw, 0);
var asShort = BitConverter.ToInt16(raw, 0);
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