Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中使用否定的位操作_Java_Bit Manipulation - Fatal编程技术网

Java中使用否定的位操作

Java中使用否定的位操作,java,bit-manipulation,Java,Bit Manipulation,我正在尝试我的比特操作,有人能提供基本的知识,可以帮助我解决比特操作吗? 我面临以下矛盾 System.out.println((~1)&1111); gives 1110. Treating ~1 as 0. System.out.println((~1)); gives -2. 从Oracle提供的: 一元逐位补码运算符“~”反转位模式;它可以应用于任何整数类型,使每个“0”都成为“1”,每个“1”都成为“0” ~1得到-2的原因是: 倒是 1111 1111 1111 1111

我正在尝试我的比特操作,有人能提供基本的知识,可以帮助我解决比特操作吗? 我面临以下矛盾

System.out.println((~1)&1111); gives 1110. Treating ~1 as 0.
System.out.println((~1)); gives -2. 
从Oracle提供的:

一元逐位补码运算符“~”反转位模式;它可以应用于任何整数类型,使每个“0”都成为“1”,每个“1”都成为“0”

~1
得到-2的原因是:

倒是

1111 1111 1111 1111 1111 1111 1111 1110
由于Java使用2-补码,因此会产生
-2


将(~1)和1111分解为位:

1111 1111 1111 1111 1111 1111 1111 1110
0000 0000 0000 0000 0000 0100 0101 0111
___________________________________________
0000 0000 0000 0000 0000 0100 0101 0110
base 10中的
0100 0101 0110
是Oracle提供的
1110

一元逐位补码运算符“~”反转位模式;它可以应用于任何整数类型,使每个“0”都成为“1”,每个“1”都成为“0”

~1
得到-2的原因是:

倒是

1111 1111 1111 1111 1111 1111 1111 1110
由于Java使用2-补码,因此会产生
-2


将(~1)和1111分解为位:

1111 1111 1111 1111 1111 1111 1111 1110
0000 0000 0000 0000 0000 0100 0101 0111
___________________________________________
0000 0000 0000 0000 0000 0100 0101 0110

0100 0101 0110
基数10是
1110

让我们假设每个数字正好有三位。在这种情况下,如果我们想使用有符号的数字(正数和负数),我们将得到3位-

000=0,显然

001=1

010=2

011=3

100=-4

101=-3

110=-2

111=-1

所以,如果你用~,这真的是001(因为~,操作符将每一位都反转),那么你得到110,这将是,正确的,十进制数-2


如果你做一个和1110&1111,那么很明显你得到了1110。

让我们假设一下,每个数字正好有三位。在这种情况下,如果我们想使用有符号的数字(正数和负数),我们将得到3位-

000=0,显然

001=1

010=2

011=3

100=-4

101=-3

110=-2

111=-1

所以,如果你用~,这真的是001(因为~,操作符将每一位都反转),那么你得到110,这将是,正确的,十进制数-2


如果你做了一个和1110&1111,那么你显然得到了1110。

你能看看这个编辑吗,我已经在Eclipse IDE上试过了。0和什么有什么关系?0和1的逻辑将相互补充。你明白我的问题了吗?不,我不知道“将~1视为0”是什么意思。你能看看这个编辑吗,我试过在Eclipse IDE上运行它。0与任何事情有什么关系?0和1的逻辑将相互完善。你明白我的问题了吗?没有。我不知道“将~1视为0”是什么意思。因为1111111111111111111111111111111111110&0000 0000 0000 0000 1111是1110(因为只有这三位在两个数字中都是1)。@Rahul“当使用一元运算符操作时,编译器将数字视为位向量”对不起,我不知道你在问什么。你是在问编译器是否将一元运算涉及的数字视为以2为基数的数字,而将另一个数字视为以10为基数的数字?如果是,则为否。两个数字的处理基数相同:
~1
中的
1
表示以10为基数的数字(其类型为
int
).唯一使用的时基2是实际执行操作时,在该操作中,两个数字都以时基处理2@OliverCharlesworth除非通过前缀另有明确说明(
0x
表示基数16,
0b
表示基数2,或仅
0
表示基数8),所有数字(包括整数)都在base中处理10@VinceEmigh-但它们不是在任何基础上处理的;它们只是值。你说的是人类可读的
int
文字表示。@OliverCharlesworth是的,我指的是人类可读的表示。
~1
中的
1
和值e
1111
是以10为基数的值。因为1111111111111111111111111111111111111110&0000 0000 0000 1111是1110(因为只有这三个位在两个数字中都是1)。@Rahul“当使用一元运算符操作时,编译器将数字视为位向量”对不起,我不知道你在问什么。你是在问编译器是否将一元运算涉及的数字视为以2为基数的数字,而将另一个数字视为以10为基数的数字?如果是,则为否。两个数字的处理基数相同:
~1
中的
1
表示以10为基数的数字(其类型为
int
).唯一使用的时基2是实际执行操作时,在该操作中,两个数字都以时基处理2@OliverCharlesworth除非通过前缀另有明确说明(
0x
表示基数16,
0b
表示基数2,或仅
0
表示基数8),所有数字(包括整数)都在base中处理10@VinceEmigh-但它们不是在任何基础上处理的;它们只是值。你说的是人类可读的
int
文字表示。@OliverCharlesworth是的,我指的是人类可读的表示。
~1
中的
1
和值e
1111
是10个基本值。