英文:
Experiencing an issue with the tilde (Bitwise NOT) operator
问题
我一直在尝试使用位运算符,以下是我的代码:
#include <stdio.h>
int main() {
int x = 0b110000;
int y = ~x;
printf("x: %d", x);
printf("\ny: %d", y);
return 0;
}
这段代码的输出结果是:
x: 48
y: -49
我不明白的是为什么 y=-49
,因为我使用了位取反运算符,它不应该反转位并使 y=0b001111
(y=15
)吗?
我尝试使用其他数字来检查是否有异常情况,但并没有。我尝试了从0到29的每个数字,y = -(x+1)
的模式都保持不变。
有人能解释为什么会发生这种情况吗?
任何帮助都将不胜感激。
英文:
I've been experimenting with bitwise operators, here's my code:
#include <stdio.h>
int main() {
int x = 0b110000;
int y = ~x;
printf("x: %d", x);
printf("\ny: %d", y);
return 0;
}
The output of this code block is:
x: 48
y: -49
The thing I don't understand is why y=-49
, because I used the bitwise NOT operator, shouldn't it reverse the bits and make y=0b001111
(y=15
)?
I tried to use other numbers to check if it was an exception, it was not. I tried every number from 0 to 29 and the pattern of y = -(x+1)
remained.
Can anyone explain why is this happening?
Any help is appreciated.
答案1
得分: 2
int y = ~x & 0x3F;
英文:
make y=0b001111
- no, it should not make such y
, because x
is 0b00000000000000000000000000110000
. uint8_t x
will be 0b00110000
and also will not make make y=0b001111
but 0b11001111
.
You might want to leave only 6 least bits in the result:
int y = ~x & 0x3F;
答案2
得分: 2
>我不明白的是为什么 y=-49
y
的值显示为 -49
,因为 printf
语句将 y
的值以有符号整数 %d
的形式打印出来。
或者,您可以选择将 y
的值以无符号整数的形式打印出来,使用 printf("y: %u\n", y)
。
这个结果将是-
x = 48
y = 4294967247
>因为我使用了位取反运算符,它不应该反转位并使 y=0b001111 (y=15) 吗?
假设在您的系统上,整数的大小为 32 位,在执行位取反操作时,存储在 y
中的值为:
二进制中的 11111111111111111111111111001111
。
(这与有符号的二进制补码中的 -49
,十进制中的 4294967247
或十六进制中的 0XFFFFFFCF
相同。)
为了获得所需的结果,您可能需要使用位与运算符 &
来屏蔽掉不需要的位。
例如:
#include <stdio.h>
int main() {
int x = 48;
int y = ~x;
int mask = 0xff; // 所有 8 位都设为 1
y = y & mask;
printf("x: %d", x);
printf("\ny: %d\n", y);
return 0;
}
英文:
>The thing I don't understand is why y=-49
The value of y
is displayed as -49
as the printf
statement is printing the value of y
as a signed integer - %d
.
Alternatively, you could choose to print the value of y
as an unsigned integer using printf("y: %u\n", y)
.
This result would be-
x = 48
y = 4294967247
>because I used the bitwise NOT operator, shouldn't it reverse the bits and make y=0b001111 (y=15)?
Assuming that the size of an integer on your system is 32 bits, when the bitwise NOT operation is performed, the value stored at y
is:
11111111111111111111111111001111
in binary.
(Which is the same as -49
in Signed 2's complement or 4294967247
in decimal or 0XFFFFFFCF
in hexadecimal.)
In order for you to get the desired result, you might have to use the bitwise &
operator to mask off the undesired set of bits.
For example:
#include <stdio.h>
int main() {
int x = 48;
int y = ~x;
int mask = 0xff; //All 8 bits set to 1
y = y & mask;
printf("x: %d", x);
printf("\ny: %d\n", y);
return 0;
}
答案3
得分: 0
NOT运算符的过程是将所有的1转换为0,所有的0转换为1。如果标志位(sign flag)被设置,那么该数字将被视为负数(-ve),否则将被视为正数(+ve)。
在您的示例中,您的两个变量都是32位整数。因此,从右边的第6位到第31位的位将被转换为1。这就是为什么结果是-49的原因。
至于标志位,它之所以被设置,是因为在补码运算中进行了某种加法运算。
英文:
The procedure for the NOT operator is to convert all ones (1's) to zeros (0's) and all zeros (0's) to ones (1's). If the sign flag is set then the number will be regarded as negative (-ve), else it will be regarded as positive (+ve).
In your example, both of your variables are 32-bit integers. So bits 6 to 31 (starting at 0 from the right bit) will be converted to ones (1's). That is why the result is -49.
As for the sign flag, it was set because an addition was done somewhere during the complement.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论