【发布时间】:2021-09-13 03:29:07
【问题描述】:
我正在尝试在 C 中实现两个按位函数:
set(unsigned *x, unsigned n, unsigned v) --> 将值 x 的第 n 位设置为值 v。V 为 0 或 1,为简单起见,N 为 [0, 31]。
flip(unsigned *x, unsigned n) --> 翻转 x 中的第 N 位。为简单起见,假设 N 为 [0,31]。
我的实现:
void set(unsigned *x, unsigned n, unsigned v) {
*x = (1 << n) | v;
}
void flip(unsigned *x, unsigned n) {
*x = n ^ (1 << *x);
}
我的问题:这些功能不符合逻辑。
测试用例的输出:
测试 set_bit()
set_bit(0x0000004e,2,0) 返回 0x00000004 但我们预期为 0x0000004a set_bit(0x0000006d,0,0) 返回 0x00000001 但我们预期为 0x0000006c set_bit(0x0000004e,2,1) 返回 0x00000005 但我们预期为 0x0000004e set_bit(0x0000006d,0,1) 返回 0x00000001 但我们预期为 0x0000006d set_bit(0x0000004e,9,0) 返回 0x00000200 但我们预期为 0x0000004e set_bit(0x0000006d,4,0) 返回 0x00000010 但我们预期为 0x0000006d set_bit(0x0000004e,9,1) 返回 0x00000201 但我们预期为 0x0000024e set_bit(0x0000006d,7,1) 返回 0x00000081 但我们预期为 0x000000ed
测试flip_bit()
flip_bit(0x0000004e,0) 返回 0x00004000,但我们预期为 0x0000004f flip_bit(0x0000004e,1) 返回 0x00004001,但我们预期为 0x0000004c flip_bit(0x0000004e,2) 返回 0x00004002,但我们预期为 0x0000004a flip_bit(0x0000004e,5) 返回 0x00004005,但我们预期为 0x0000006e flip_bit(0x0000004e,9) 返回 0x00004009,但我们预期为 0x0000024e
【问题讨论】:
-
对于
set_bit,您不认为*x之前的值应该出现在赋值右侧的某处吗?用纸和铅笔尝试一些例子。 -
而
1 << *x不能在flip_bit中正确;*x不是位索引(不必在 0..31 范围内)。 -
这篇文章的原始版本特别声明不允许循环和条件。现在显然已经消除了这种情况。不要那样做。如果你改变了你想要什么的想法,那是一个新的、不同的问题。尽管循环对此无济于事,但条件语句可以,并且最好的解决方案将使用它们(
if/else或条件?:运算符)。当然,没有它们也可以完成,但这不是最好的方法。 -
在我链接的问题中,请注意接受的答案中的“将第 n 位更改为 x”部分。
标签: c function binary bitwise-operators