【问题标题】:Bitwise shifting bits in c#c#中的按位移位
【发布时间】:2012-09-11 05:41:59
【问题描述】:

我有一个关于在无符号整数中移位的问题。我有两个无符号整数,比如说var1var2。我需要把var2 的最左边的var1 位移动到最右边的位置。所以如果var112 并且var20x13ac8d08,那将导致var2 变成0xc8d0813a。谁能帮助我如何在 C# 中做到这一点?

谢谢

迈克尔

【问题讨论】:

  • “移动”是指 var2 最右边的位被推到左边。

标签: c# bit-manipulation bits


【解决方案1】:

试试这个:

var2 = (var2 << var1) | (var2 >> (32 - var1));

在方法形式中:

uint CyclicShiftLeft(uint input,int countBits)
{
   return (input << countBits) | (input >> (32 - countBits))
}

编辑

上面代码中32的意义请看cmets。

【讨论】:

  • 比我开始做的要优雅得多。请记住,32 可能会更改为 64 或 16,具体取决于您的无符号数(如果它是无符号长整数,则应为 64)
  • 这里对新手 OP 的解释会很棒。我开始了一个冗长的回答,但你的回答太快了,而且很划算。
  • @zmbq 很清楚,您可以随时使用 sizeof(uint)*8 或您正在使用的任何类型。我试图提出一个通用的扩展方法,但不幸的是C# doesn't have generic constraints on integral types
  • @logicnp 谢谢大家,返回(输入> (32 - countBits)) 完美!
【解决方案2】:

首先,我不明白您问题中 var1 的功能。 我也,您没有指定要移位或更正确地旋转的位数。在示例中,我假设您要将 12 个最高有效位移动到最低有效位置。 (这就是 var1 的用途吗?)

 unsigned int var2 = 0x13ac8d08;
 unsigned int temp = (var2 >> 20) & 0xfff; // store and mask 12 bits in least significant position 
  var2 <<= 12; // shift left
  var2 &= 0xfffff00; // mask to make sure no bits dragged from lsb by shift
  var2 |= temp;

屏蔽可能不是绝对必要的,但确保它永远不会有坏处。机器语言中的移位命令有时可能会扩展最高或最低有效位,而您不希望这样。

【讨论】:

  • 不,是十二号。但是 12 可以是任何东西(234,23 23412 等)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
相关资源
最近更新 更多