C# 设置了给定位数的整数到字节

C# 设置了给定位数的整数到字节,c#,.net,C#,.net,我不知道该怎么称呼它,这使得谷歌搜索更困难 我有一个整数,比如说3,我想把它转换成11100000,也就是说,一个字节,从最高位开始设置整数位数的值 我想可以通过以下方式实现: byte result = 0; for(int i = 8; i > 8 - 3; i--) result += 2 ^ i; 但是,有没有更快/更好的,或者更好的,标准库包含在.net中?因为只有一些可能性,您可以缓存它们: int n = 3; // 0..8 int mask = 0xFF00;

我不知道该怎么称呼它,这使得谷歌搜索更困难

我有一个整数,比如说
3
,我想把它转换成
11100000
,也就是说,一个字节,从最高位开始设置整数位数的值

我想可以通过以下方式实现:

byte result = 0;
for(int i = 8; i > 8 - 3; i--)
    result += 2 ^ i;

但是,有没有更快/更好的,或者更好的,标准库包含在.net中?

因为只有一些可能性,您可以缓存它们:

int n = 3; // 0..8 
int mask = 0xFF00;
byte result  = (byte) (mask >> n);
// Each index adds another bit from the left, e.g. resultCache[3] == 11100000.
byte[] resultCache = { 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0XF8, 0xFC, 0xFE, 0xFF };

如果您不小心尝试获取n>8的值,您也会得到一个异常而不是无声错误。

如果您的整数大于8怎么办?在C中,只有一个小点^是异或,而不是幂运算符。@Martin Haha谢谢,我刚才花了几秒钟才意识到。有时很容易忘记,如果你在编程时也碰巧写了一篇论文的方程式。@Max,我之所以知道这一点,是因为我自己犯了100次同样的错误。@Cameron,是的,因为
mask>>n
的结果是
int
@JimRhodes类型的,我认为问题定义排除了这一点。+1安慰奖,因为它指出了解决许多此类问题(查表)的简单而有效的方法,而这些方法很容易被忽视,所有程序员都应该在他们的诀窍中找到。(在这种情况下,这并不像亨克的解决方案那么好)@JasonWilliams,谢谢。在发布此备选方案之前,我投票支持了Henk的优雅解决方案:-)。