Tag: 位移

为什么我会通过负值将奇怪的结果移位?

这个问题不是这个问题的重复。 我遇到了一种情况,我可能不得不将一个(正)数字左移一个负值,即8 << -1。 在那种情况下,我希望结果是4,但我以前从未这样做过。 所以我编写了一个小测试程序来验证我的假设: for (int i = -8; i <= 4; i++) Console.WriteLine("i = {0}, 8 << {0} = {1}", i, 8 << i); 令我震惊和惊讶的是给了我以下输出: i = -8,8 << -8 = 134217728 i = -7,8 << -7 = 268435456 i = -6,8 << -6 = 536870912 i = -5,8 << -5 = […]

在C#中获取整数的上下字节并将其作为char数组发送到com端口,如何?

CI会这样做 int number = 3510; char upper = number >> 8; char lower = number && 8; SendByte(上部); SendByte(低级); 上下都是= 54 在C#中我这样做: int number = Convert.ToInt16(“3510”); byte upper = byte(number >> 8); byte lower = byte(number & 8); char upperc = Convert.ToChar(upper); char lowerc = Convert.ToChar(lower); data = “GETDM” + upperc + lowerc; comport.Write(data); 但是在调试器编号= […]

为什么在移位32位值时仅使用移位操作数的低5位? (例如(UInt32)1 << 33 == 2)

请考虑以下代码: UInt32 val = 1; UInt32 shift31 = val << 31; // shift31 == 0x80000000 UInt32 shift32 = val << 32; // shift32 == 0x00000001 UInt32 shift33 = val << 33; // shift33 == 0x00000002 UInt32 shift33a = (UInt32)((UInt64)val << 33); // shift33a == 0x00000000 它不会生成警告(关于使用大于32的class次),因此它必须是预期的行为。 实际被放到生成的程序集中的代码(或者至少是Reflector对代码的解释)是 uint val = 1; uint shift31 = val […]

当操作数<32位时,为什么shift操作总是导致signed int

为什么对无符号整数的移位操作给出无符号结果,但对较小的无符号操作数的操作会导致有符号的int? int signedInt = 1; int shiftedSignedInt = signedInt << 2; uint unsignedInt = 1; uint shiftedUnsignedInt = unsignedInt << 2; //OK. unsigned result short signedShort = 1; int shiftedsignedShort = signedShort << 2; ushort unsignedShort = 1; uint shiftedUnsignedShort = unsignedShort << 2; //CS0266: Can't cast int to uint sbyte signedByte = 1; int […]

位移N位

你好关于位移的快速问题 我有一个HEX = new byte [] {0x56,0xAF}的值; 这是0101 0110 1010 1111 我想要前n位,例12 然后转移剩下的4(16-12)得到0000 0101 0110 1010(1386 dec) 我无法绕过它并使其可扩展到n位。 谢谢!

在.NET中移动符号位

我正在从单色位图中读取位。 我以相反的顺序将每16位存储在一个short中。 如果位图中的位为黑色,则存储1.如果为白色,则存储0。 例如:对于位图:bbbw bbbw bbbw wwww 我的简称是:0000 0111 0111 0111 我尝试这样做的第一种方式是: short m; // … Color c = bmp.GetPixel(j, i); if (cR == Color.Black) m |= short.MinValue; m >>= 1; // … 经过一次任务和class次后,我得到了预期的-32768(1000 0000 0000 0000)。 第二次我得到-16384(1100 0000 0000 0000)。 我改变了我的代码以使用ushort并将if行更改为s |= (ushort)Math.Pow(2, 15); 现在它的工作原理。 我的问题是:为什么标志位不会在.NET中发生变化? 有没有办法改变标志位?

在C#中,BitArray获取比特值比使用逐位移位的简单结合更快吗?

1)。 var bitValue = (byteValue & (1 << bitNumber)) != 0; 2)。 使用带有Get(int index)方法的System.Collections.BitArray 什么更快? 在.NET项目的什么情况下, BitArray比按位移位的简单连接更有用?

何时在C#中使用Shift运算符<>?

我正在研究C#中的移位运算符,试图找出何时在我的代码中使用它们。 我找到了答案,但对于Java,你可以: a)进行更快的整数乘法和除法运算: * 4839534 * 4 *可以这样做: 4839534 << 2 要么 543894/2可以这样做: 543894 >> 1 对于大多数处理器,移位操作比乘法更快。 b)将字节流重组为int值 c)用于加速图形操作,因为红色,绿色和蓝色由单独的字节编码。 d)将小数字装入一个长的… 对于b,c和d,我无法在这里想象一个真实的样本。 有谁知道我们是否可以在C#中完成所有这些项目? C#中的移位运算符是否有更实际的用途?

左位移255(作为一个字节)

任何人都可以解释为什么以下不编译? byte b = 255 << 1 错误: 常量值’510’无法转换为’字节’ 我期待二进制中的以下内容: 1111 1110 类型转换困扰了我。