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
和值e1111
是以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
和值e1111
是10个基本值。