Java简单的按位运算

时间:2017-07-25 14:26:43

标签: java bit-manipulation operations

我们给出整数n,值v(v = 0或1)和位置p。编写修改n的运算符序列,以便在n的二进制表示中保持位置p处的值v。例如:

  • n = 5(00000101),p = 3,v = 1 - > 13(00001101)
  • n = 5(00000101),p = 2,v = 0 - > 1(00000001)

这是我的代码:

int n1 = 35;
int p1 = 3;
int v = 1;
n1 = n1 + (v << p1);
System.out.println(n1);

当v = 1时它起作用,但当v = 0时它不起作用。

2 个答案:

答案 0 :(得分:0)

由于您希望将索引“设置”为某个值,因此需要执行以下两项操作之一

'and' will set 0 values at an index to 0, but won't work for 1 values
'or' will set 1 values at an index to 1, but won't work for 0 values

现在您需要做的就是在正确的索引处输入正确的数字。这可以通过转移1来完成。

'<<' moves the 1 a number of places

例如

'1 << 3' shifts the 1 three places, resulting in '00001000'

记住,对于某些操作我们需要零,要在那个地方得到零,你需要反转位

'not' or '~' flips all the bits in a number

~00001000 yeilds 11110111

现在我们可以在索引中使用1或0,并且只需要使用if语句根据所需操作选择正确的语句并应用相应的and或{{1}操作来设置我们想要的位。

答案 1 :(得分:0)

好的,我认为这样可行,但如何在控制台上正确打印结果?

    // Swapping i and j: i ^= j, j ^= i, i ^= j;
    // Getting the pth byte: (n >> p) & 1
    // Setting the pth byte to v: (v == 0) ? (n & ~(1 << p)) : (n | 1 << p)
    static int Exchange(int n, int i, int j)
    {
        n = ((n >> i) & 1 ^ (n >> j) & 1) == 0 ? (n & ~(1 << j)) : (n | 1 << j);
        n = ((n >> i) & 1 ^ (n >> j) & 1) == 0 ? (n & ~(1 << i)) : (n | 1 << i);
        n = ((n >> i) & 1 ^ (n >> j) & 1) == 0 ? (n & ~(1 << j)) : (n | 1 << j);

        return n;
    }

    public static void main(String[] arguments)
        {
            int n = 56, p = 3, q = 24, k = 3;

            while (k-- != 0) n = Exchange(n, p++, q++);
        }