【问题标题】:XOR and Shifting bits in array数组中的异或和移位
【发布时间】:2016-04-27 03:24:14
【问题描述】:

我有一个数组,其中包含一个 16 位值,每个位都在数组索引中。我想要做的是对特定数组元素执行“按位”异或,然后将所有元素移动 1(带换行)。

特别是,我想对数组元素 2、3 和 5 与最后一个元素 16 使用 XOR。

这个代码应该是循环的,一旦它完成了特定数量的循环(65535),它应该返回到原始输入值。

这是我的代码:

#include <iostream>
using namespace std;

void main()
{
    //Initial array input
    int state_array[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 };
    int temp[1] = { 0 };

    int array_size = sizeof(state_array) / (sizeof(temp[0]));

    for (int i = 0; i<65535; i++)
    {
        temp[0] = state_array[15];

      //XOR Values
        for (int j = 0; j<16; j++) {
            if ((j == 2 || j == 3 || j == 5) && state_array[15] == 1) {
                state_array[j] = !state_array[j];
            }
        }

        //Shift values
        for (int j = array_size-1; j>0; j--)
        {
            if (j == 0) {
                state_array[0] = temp[0];
            }
            else {
                state_array[j] = state_array[j-1];
            }
        }
    }
}

应该发生的是,在 65535 次迭代之后,数组返回值 0000000000000001,但这并没有发生,我不知道为什么。我觉得这是我在代码中忽略的一个小而明显的事情,但是我无法弄清楚。

【问题讨论】:

  • 程序输出 0001011111110010。我在 XOR 和移位后打印结果,似乎移位中有问题,但我不是 100% 确定。

标签: c++ arrays xor


【解决方案1】:

问题是您没有正确索引。而不是您的 XORing 语句看起来像这样:

if ((j == 2 || j == 3 || j == 5) && state_array[15] == 1) {
    state_array[j] = !state_array[j];
}

它需要以 0 为索引,而不是 1,并且应该如下所示:

if ((j == 1 || j == 2 || j == 4) && state_array[15] == 1) {
    state_array[j] = !state_array[j];
}

具有讽刺意味的是,您的state_array[15] 是正确的,只是需要修复235

此外,您的for 循环应该有条件j&gt;=0 而不仅仅是j&gt;0

【讨论】:

    【解决方案2】:

    在 shift 部分,您永远不会遇到 j == 0 条件,因为您的 for 循环条件是 j &gt; 0

    【讨论】:

    • 那么我怎样才能改变循环,让我得到包装?即索引 15 应该换行到索引 0。
    • 您应该能够将 for 循环条件更改为 j &gt;= 0。因为 else 部分不会在 j == 0 的情况下执行,所以应该是安全的,以避免超出范围。
    • 刚试了一下,它把我的输出改成了 0001010101101100。结果不同,但仍然不正确。
    • 此外,您的 XOR 部分并没有真正完成听起来您想要完成的事情。您只是在这些位置翻转位。异或运算至少需要 2 个输入。
    • XOR 操作是正确的,因为只有最后一位为高时才会翻转该位。 A XOR 1 = ~A
    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多