首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找二进制数的二进制组成

查找二进制数的二进制组成
EN

Stack Overflow用户
提问于 2020-06-18 08:59:54
回答 1查看 98关注 0票数 0

对于C#来说,这是一个非常新的问题,所以这可能是一个愚蠢的问题。

我正在使用很多UInt64,这些都是十六进制的,对吧?如果我们看一下它的二进制表示,我们是否可以返回这样一个数组,如果我们对其应用'or‘操作,我们将返回到原始的UInt64?

例如,让我们说

代码语言:javascript
复制
x = 1011

然后,我正在寻找一种有效的方法来达到,

代码语言:javascript
复制
f(x) = {1000, 0010, 0001}

其中这些数字是十六进制的,而不是二进制。对不起,我也是新来的。

我已经有了一个方法,但感觉效率很低。我首先转换成一个二进制字符串,然后遍历该字符串以找到每个'1‘。然后,我将相应的二进制数添加到数组中。

有什么想法吗?

这里有一个更好的例子。我有一个十六进制数x,形式是,

代码语言:javascript
复制
UInt64 x = 0x00000000000000FF

其中x的二进制表示为

代码语言:javascript
复制
0000000000000000000000000000000000000000000000000000000011111111

我希望找到一个由十六进制数组成的数组(UInt64??)使得应用于该数组的所有成员的或操作将再次导致x。例如,

代码语言:javascript
复制
f(x) = {0x0000000000000080, // 00000....10000000
        0x0000000000000040, // 00000....01000000
        0x0000000000000020, // 00000....00100000
        0x0000000000000010, // 00000....00010000
        0x0000000000000008, // 00000....00001000
        0x0000000000000004, // 00000....00000100
        0x0000000000000002, // 00000....00000010
        0x0000000000000001  // 00000....00000001
}

我认为问题可以归结为找到一种有效的方法来在二进制扩展中找到‘1’的索引……

代码语言:javascript
复制
public static UInt64[] findOccupiedSquares(UInt64 pieces){
    UInt64[] toReturn = new UInt64[BitOperations.PopCount(pieces)];
    if (BitOperations.PopCount(pieces) == 1){
        toReturn[0] = pieces;
    }
    else{
        int i = 0;
        int index = 0;
        while (pieces != 0){
            i += 1;
            pieces = pieces >> 1;
            if (BitOperations.TrailingZeroCount(pieces) == 0){ // One
                int rank = (int)(i / 8);
                int file = i - (rank * 8);
                toReturn[index] = LUTable.MaskRank[rank] & LUTable.MaskFile[file];
                index += 1;
            }
        }
    }
    return toReturn;
}
EN

回答 1

Stack Overflow用户

发布于 2020-06-19 10:17:13

你的问题仍然让我感到困惑,因为你似乎把数字和数字表示的概念混在一起了。即存在一个整数,然后存在该整数的十六进制表示。

您可以非常简单地将任何整数分解为以2为基数的部分。

代码语言:javascript
复制
ulong input = 16094009876; // example input
ulong x = 1;
var bits = new List<ulong>();
do
{
    if ((input & x) == x)
    {
        bits.Add(x);
    }
    x <<= 1;
} while (x != 0);

bits现在是一个整数列表,每个整数代表输入中的一个二进制1位。这可以通过添加(或ORing -相同的东西)所有值来验证。所以这个表达式是真的:

代码语言:javascript
复制
bits.Aggregate((a, b) => a | b) == input

如果您想要列表中这些整数的十六进制表示,您可以简单地使用ToString()

代码语言:javascript
复制
var hexBits = bits.Select(b => b.ToString("X16"));

如果需要整数的二进制表示形式,可以使用Convert

代码语言:javascript
复制
var binaryBits = bits.Select(b => Convert.ToString((long)b, 2).PadLeft(64, '0'));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62440694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档