我们给出整数n,值v(v = 0或1)和位置p。编写修改n的运算符序列,以便在n的二进制表示中保持位置p处的值v。例如:
这是我的代码:
int n1 = 35;
int p1 = 3;
int v = 1;
n1 = n1 + (v << p1);
System.out.println(n1);
当v = 1时它起作用,但当v = 0时它不起作用。
答案 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++);
}