我正在研究面试,并且已经尝试了几个小时来理解这个问题:

您将获得两个32位数字N和M,以及两个位置i
和j。编写一种方法将N中i和j之间的所有位设置为等于M
(例如,M变成位于i并从j开始的N的子串)。

有人可以举一个完整的例子,逐步说明实际需要什么吗?我是否需要设置i和j之间的值以形成M的值,或者实际上设置M中的位?

有一些关于位操作的好的教程可以解释这些概念吗?

谢谢!

最佳答案

可以使用“masking”来实现

  • 使用按位或增量
  • 为位置i至j创建掩码,并将每个位设置为1
  • 使用掩码
  • 的按位与和按位非将N中的位清空
  • 使用掩码按位与
  • 从M中选择位
  • 使用按位或
  • 复制位

    我知道我在示例中使用了十六进制,但是同样的原理也适用,只是更易于阅读。


    int n = 0x12345678;
    int m = 0x55555555;
    
    int i = 4; // assume right to left
    int j = 15;
    
    int mask = 0;
    for (int pos = i; pos <= j; pos++) {
        mask = mask | (1 << pos);
    }
    System.out.println(String.format("mask is     0x%08x", mask));
    
    int nCleared = n & ~mask;
    System.out.println(String.format("clear n     0x%08x", nCleared));
    
    int bitsFromM = (m & mask);
    System.out.println(String.format("Bits from m 0x%08x", bitsFromM));
    
    int nWithM = bitsFromM | nCleared;
    System.out.println(String.format("n with m    0x%08x", nWithM));
    

    输出量
    mask is     0x0000fff0
    clear n     0x12340008
    Bits from m 0x00005550
    n with m    0x12345558
    

    关于java - 位操作修改位以包括数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27331832/

    10-09 03:15