【问题标题】:Help to begin in assigning specific bits帮助开始分配特定位
【发布时间】:2026-01-13 08:20:03
【问题描述】:

所以我的班级遇到了一个问题,我无法开始学习。我不是要求人们为我解决问题,我只是希望朝着正确的方向轻推。我需要在 C 中创建一个函数,当给定任何 32 位整数时,它会返回一个整数,其中每 4 位从最小 sig 位开始设置为 1。我明白它最终应该是什么样子,但开始时我迷路了。我们不允许使用任何 for 循环或条件,只能使用标准的按位和逻辑运算符(!~ & ^ | + >)。再一次,我不是要求任何人为我做这件事,我只是想要一些帮助,让我在正确的轨道上思考。我在这里和其他页面上看到了其他一些帖子,但似乎没有一个点击。我知道您可以将 1 移位到某个位置 x

【问题讨论】:

    标签: c bit-shift bits logical-operators


    【解决方案1】:
    int get_int_with_every_fourth_bit_set()
    {
        return 0x88888888;
    }
    

    好吧,那主要是开玩笑。以下是位运算符的作用列表:

    • bitwise NOT (~):稍微切换一下,0 到 1 和 1 到 0
    • AND (&):如果该位置的位在两个操作数中都设置了,则设置一个位
    • OR (|):如果在任一操作数中设置了该位置的位,则设置一个位
    • XOR (^):如果在两个操作数之间恰好设置了该位置的一位,则设置一位
    • 按位移位(<<>>):将每个位在给定方向上移动指定的数量。左移时,将零添加到最低有效位。右移时,如果值为无符号或正数,将添加一个零。

    以下是一些值得了解的按位技巧:

    向左移一位与乘以二相同。按位右移 1 与除以 2 并向下舍入相同。

    所有 2 的幂都只有一个 1 位。要查看一个数字是否是 2 的幂,您可以这样做:

    return !(x & (x - 1)) && x

    例如,说x = 16,它是2 的幂。然后,x - 1 = 15,所以要进行与运算的值是0001000000001111。由于每个位位置在两个操作数中的至少一个中具有零,因此结果为零。 !0 是真的,所以检查一下x != 0。由于16 != 0,该语句返回true。如果您尝试使用不是 2 且不是 0 的幂的数字,则 x & (x - 1) 检查将始终为真。太酷了!

    另一个提示:由于0 ^ 0 = 01 ^ 1 = 0,您可以使用XOR 来查看哪些位发生了变化。例如,如果您有两个字节并且想要查看在此期间发生更改的位,则两个字节的 XOR 将在所有已更改位的位置为您提供 1。

    【讨论】:

    • 也许 OP 正在寻找a_32bit_int|0x88888888
    【解决方案2】:

    你能写下(十六进制)每个第 4 位设置为 1,所有其他位设置为 0 的 32 位整数吗?

    现在,您是否可以对输入和这个幻数应用一个操作,它将输入的每 4 位设置为 1,但不理会其他位?

    【讨论】:

      【解决方案3】:

      查看bitmasking

      ...因此,为了确保某个位处于打开状态,OR 可以与 1 一起使用。若要保持位不变,OR 与 0 一起使用。

      因此,您的情况的掩码(其他位保持不变)将是:

      二进制:10001000100010001000100010001000 十六进制:88888888

      【讨论】: