当前位置: 首页 > 知识库问答 >
问题:

Java异或运算

宋子辰
2023-03-14

杰克和丹尼尔是朋友。他们想加密他们的谈话,这样他们就可以避免被侦探机构拦截。所以他们发明了一种新的密码。每个消息都被编码为其长度为n的二进制表示形式B,然后被记录K次,移动0,1,...,K-1位。如果b=1001010,k=4,它看起来像:

1001010
 1001010
  1001010
   1001010

然后在每一列计算XOR并写下来。这个数字称为s。例如,对上面示例中的数字进行异或运算,结果是

1110100110

然后将编码的消息S和K发送给Daniel。

    null
    null
   7 4
   1110100110
   1001010
   6 2
   1110001
   101111
1001010
 1001010
  1001010
   1001010
----------
1110100110
101111
 101111
-------
1110001 
import java.io.*;

public class Solution {

    public static void solve(Input in, PrintWriter out) throws IOException {
        int n = in.nextInt();
        int k = in.nextInt();
        char[] c = in.next().toCharArray();
        int x = 0;
        char[] ans = new char[n];
        for (int i = 0; i < n; ++i) {
            ans[i] = (char) (((c[i] - '0') ^ x) + '0');// I understand we are converting the character into integer (c[i] - '0') then xoring it with x which is holding 0 and then again adding '0' to convert back it into character.
            x ^= ans[i] - '0';// But why are we doing this!!. From this line onward things are not clear.
            if (i >= k - 1) {
                ****FILL THE MISSING LINE HERE****

            }
        }
        out.println(ans);
    }

    public static void main(String[] args) throws IOException {
        PrintWriter out = new PrintWriter(System.out);
        solve(new Input(new BufferedReader(new InputStreamReader(System.in))), out);
        out.close();
    }

    static class Input {
        BufferedReader in;
        StringBuilder sb = new StringBuilder();

        public Input(BufferedReader in) {
            this.in = in;
        }

        public Input(String s) {
            this.in = new BufferedReader(new StringReader(s));
        }

        public String next() throws IOException {
            sb.setLength(0);
            while (true) {
                int c = in.read();
                if (c == -1) {
                    return null;
                }
                if (" \n\r\t".indexOf(c) == -1) {
                    sb.append((char)c);
                    break;
                }
            }
            while (true) {
                int c = in.read();
                if (c == -1 || " \n\r\t".indexOf(c) != -1) {
                    break;
                }
                sb.append((char)c);
            }
            return sb.toString();
        }

        public int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        public long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        public double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }
    }
}

共有1个答案

丰景同
2023-03-14

注意:请阅读解释,简单地通过复制粘贴答案来解决挑战是没有用的。

可以利用的限制是

第一位未被加密算法触及。

第三位与第一位和第二位进行异或,所以我们所做的基本上是保持一个值,这个值是所有已经获得的值的异或,并与下一个值异或。在内部,该值为零。

示例:

接受第一个示例输入:

1110100110
       1110100110
mask    1????????
result 10
       1110100110
mask    11???????
result 100
index      0123456789       
data       1110100110
submasks    1001010
             1001010
              1001010
mask       0111??????
result     1001??????
index      0123456789
data       1110100110
submasks    1001010
             1001010
              1001010
mask       01111?????
result     10010?????

现在我们对最后一个结果位(0)和第二个结果位(0)进行异或:

index      0123456789
data       1110100110
submasks    1001010
             1001010
              1001010
mask       011111????
result     100101????

对于下一个,我们与最后一个(1)和第三个(0)进行异或,从而交换状态。通过继续执行此过程,我们最终以:

index      0123456789
data       1110100110
submasks    1001010
             1001010
              1001010
mask       0111110???
result     1001010???

现在我们不再对剩余的比特感兴趣,所以我们终止。

if (i >= k - 1) {
    x ^= ans[i-(k-1)] - '0';
}
 类似资料:
  • 本文向大家介绍c异或运算 c异或运算符号,包括了c异或运算 c异或运算符号的使用技巧和注意事项,需要的朋友参考一下 与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0 非运算:~ 1取0,0取1 ~1 = 0, ~0 = 1 ~(10001)

  • 本文向大家介绍C的|、||、&、&&、异或、~、!运算符,包括了C的|、||、&、&&、异或、~、!运算符的使用技巧和注意事项,需要的朋友参考一下 位运算     位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果。 位运算符有:     &(按位与)、|(按位或)、^(按位异或)、~ (按位取反)。     其中,按位取反

  • 我试图学习Java FX,所以我使用了一些Oracle Eample代码,但当我试图在Netbean IDE中运行它时,它给了我一个运行时错误。下面是一段代码: 而这是个例外。 Edit:好的,基于rob的回答,我添加了我在示例中遗漏的扩展,现在在我尝试扩展代码后,它甚至给出了更多的异常。下面是该异常的新代码和日志。 这是异常日志:

  • 问题内容: 我试图运行一个异步进程,但我不希望程序等到这些进程执行结束。我发现了这个问题,如何从Java程序中异步运行shell脚本,但是它没有我想要的答案。 我正在做的只是运行bash进程,而在运行bash进程后,我不希望Java程序等到完成为止。这是我所做的: 我还在main方法的末尾放出了另一张印刷品,因此得到以下输出: 但是,程序不会终止,因为这两个进程尚未终止。 我该如何解决这个问题?

  • 问题内容: 运行单元测试时,我遇到了jar hell的问题。 我遇到了上述错误,并通过删除了不必要的jar文件解决了这些错误。 但是我面临以下两个jar的问题,即tomcat-embed-core-8.0.36.jar和hibernate- jpa-2.1-api-1.0.0.Final.jar。这两者之间有一个共同的类,我需要两个jar文件,任何人都可以向我解释如何解决此问题。我都需要jar文件

  • 问题内容: 我尝试运行一个异步进程。基于以下示例:http : //tomee.apache.org/examples-trunk/async- methods/README.html 但是,只有在完全完成其中的代码后,该方法才会返回。 然后当它返回并被调用时,我将得到异常: 原因:java.lang.IllegalStateException:对象不代表实际的Future 有什么建议我想念的吗?