【问题标题】:How to use unsigned integers to represent a set?如何使用无符号整数来表示一个集合?
【发布时间】:2012-02-15 23:04:12
【问题描述】:

我被分配创建一个执行基本集合操作的程序。说明如下:

您应该将集合表示为无符号整数,其中每个位 无符号数的 表示集合的一个可能元素。因此, 我们有 32 个可能的集合元素 (0, 1, ... 31) 和 32 位位置 一个无符号整数变量(也是 0、1、... 31)。为此目的 程序不管你是否“命名”最低位 一个无符号整数为 0(最高位为 31),或者如果你 “命名”最高位 0 和最低位 31。无论哪种情况,我们都会 在位 i 中定义一个“1”表示元素 i 是 该无符号整数表示的集合。

我的第一个想法是使用数组来存储数据,但是我的教授告诉我不要这样做,而只使用无符号整数。我的问题是如何去实施这个?我的印象是,如果我在打印出来时将 unsigned int 设置为 00000000000000000,我在输出时仍然会得到 0。如果没有 400 万个测试用例,我应该如何检查集合中的每个成员?

例如,他说要重复一组 {19, 3, 31, 12, 7} 我会拥有

10000000000010000001000010001000

他提供的我将被要求构建我的定义的声明是:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

extern unsigned int setUnion(unsigned int set1, unsigned int set2);
extern unsigned int setIntersection(unsigned int set1, unsigned int set2);
extern void clearSet(unsigned int *set);
extern void add2Set(unsigned int *set, int value);
extern void deleteFromSet(unsigned int *set, int value);
extern int isMember(unsigned int set, int element);
extern void printSet(unsigned int);

任何关于如何做到这一点的想法将不胜感激。我不指望你们为我做功课,只是在寻找一些关于如何开始的帮助。

【问题讨论】:

标签: c


【解决方案1】:

使用 C 位运算符(&amp;|^&lt;&lt;&gt;&gt;~)访问 unsigned int 对象的各个位值。

【讨论】:

    【解决方案2】:

    你想看看bitwise operations。集合中的每个值都可以由无符号整数(32 位)值中的单个位表示,其中设置位(表示等于 1)表示包含。

    在 c 中,位运算符是&amp; | ^ ~ &lt;&lt; &gt;&gt;

    【讨论】:

      【解决方案3】:

      Bitwise Operation - 他要求您在无符号(32 位)整数中设置特定位。

      unsigned int foo = 1 << 31;
      

      这只是在unsigned int 中设置“第一个”位:

      1000000000000000
      

      【讨论】:

        【解决方案4】:

        如果你有号码n,它的掩码是1&lt;&lt;n,例如,检查集合s是否包含n:s&amp;(1&lt;&lt;n)

        对于联合和交集,您可以直接使用|&amp; 运算符。

        用这个来解决剩下的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-28
          • 2013-11-18
          • 2021-05-15
          • 1970-01-01
          • 1970-01-01
          • 2018-05-06
          • 2021-11-03
          • 1970-01-01
          相关资源
          最近更新 更多