legongju.com
我们一直在努力
2025-01-09 10:40 | 星期四

怎样在C#里操作BitSet数据结构

在C#中,没有内置的BitSet数据结构

using System;
using System.Collections;

public class BitSet : ICollection
{
    private readonly byte[] data;

    public BitSet(int size)
    {
        if (size < 0)
            throw new ArgumentException("Size cannot be negative", nameof(size));

        data = https://www.yisu.com/ask/new byte[(size + 7) / 8];> Get(index);
        set => Set(index, value);
    }

    public bool Get(int index)
    {
        CheckIndex(index);
        int byteIndex = index / 8;
        int bitIndex = index % 8;
        return (data[byteIndex] & (1<< bitIndex)) != 0;
    }

    public void Set(int index, bool value)
    {
        CheckIndex(index);
        int byteIndex = index / 8;
        int bitIndex = index % 8;

        if (value)
            data[byteIndex] |= (byte)(1<< bitIndex);
        else
            data[byteIndex] &= (byte)~(1<< bitIndex);
    }

    private void CheckIndex(int index)
    {
        if (index < 0 || index >= data.Length * 8)
            throw new ArgumentOutOfRangeException(nameof(index), "Index out of range");
    }

    // ICollection implementation
    public int Count => data.Length * 8;
    public bool IsSynchronized => false;
    public object SyncRoot => this;

    public void CopyTo(Array array, int index)
    {
        if (array == null)
            throw new ArgumentNullException(nameof(array));
        if (index < 0)
            throw new ArgumentOutOfRangeException(nameof(index), "Index cannot be negative");
        if (array.Length - index< Count)
            throw new ArgumentException("Destination array is not large enough");

        for (int i = 0; i< Count; i++)
            array.SetValue(Get(i), index + i);
    }

    public IEnumerator GetEnumerator()
    {
        for (int i = 0; i< Count; i++)
            yield return Get(i);
    }
}

使用示例:

var bitSet = new BitSet(10);
bitSet[3] = true;
bitSet[5] = true;

for (int i = 0; i < bitSet.Count; i++)
    Console.WriteLine($"Bit {i}: {bitSet[i]}");

这个实现提供了基本的BitSet功能,包括设置和获取位。你可以根据需要扩展此类,添加更多的方法,如按位操作、转换为字符串等。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/87336.html

相关推荐

  • Openseadragon在C#中的内存管理

    Openseadragon在C#中的内存管理

    OpenSeadragon 是一个用于高分辨率图像的 JavaScript 库,它可以在 Web 浏览器中提供平滑的缩放和拖动功能。在 C# 中使用 OpenSeadragon 通常需要将其与 WebView...

  • 如何在C#中实现Openseadragon的自定义功能

    如何在C#中实现Openseadragon的自定义功能

    OpenSeadragon 是一个用于高分辨率图像的 JavaScript 库,它可以帮助您实现丰富的交互式操作和展示 首先,确保已经安装了 OpenSeadragon。你可以通过 npm 或者直...

  • C#中Openseadragon的错误处理

    C#中Openseadragon的错误处理

    在C#中使用OpenSeadragon时,可能会遇到一些错误。为了处理这些错误,你需要了解可能出现的问题以及如何解决它们。以下是一些建议和最佳实践: 检查图像源:确保...

  • 如何用C#调用Openseadragon的API

    如何用C#调用Openseadragon的API

    要在C#中使用OpenSeadragon的API,您需要将OpenSeadragon集成到一个基于C#的Web应用程序中,例如ASP.NET Core应用程序 创建一个新的ASP.NET Core Web应用程序项目...

  • C#中的BitSet是什么如何使用

    C#中的BitSet是什么如何使用

    在C#中,并没有内置的BitSet类,但是你可以使用BitArray类来实现类似的功能
    下面是一个简单的示例,展示了如何使用BitArray类:
    using System;
    u...

  • 怎样设置C#中的epoll事件监听

    怎样设置C#中的epoll事件监听

    在C#中,没有直接提供epoll这个Linux特有的I/O多路复用技术的API 首先,安装libuv库。你可以从官方网站下载并按照说明进行安装:http://libuv.org/
    安装完成...

  • C# epoll与传统IO多路复用有何区别

    C# epoll与传统IO多路复用有何区别

    C# 语言本身并不直接支持 epoll,因为 epoll 是 Linux 系统下的 I/O 多路复用技术。在 C# 中,我们可以使用 Select 和 Poll 两种方式进行 I/O 多路复用,它们与 ...

  • 如何利用C#的epoll提高网络性能

    如何利用C#的epoll提高网络性能

    在C#中,epoll 是 Linux 内核提供的一种 I/O 事件通知机制,它可以帮助我们更有效地处理大量并发连接 安装 libuv:首先,你需要在你的系统上安装 libuv。libuv 是...