首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

~i真的等同于i != -1吗?

在编程中,符号"~"表示按位取反运算符,它将操作数的每一位取反(0变成1,1变成0)。而"!="表示不等于运算符,用于比较两个操作数是否不相等。

对于整数变量i,如果i的二进制表示中的最高位为0,则~i会得到一个正整数。而如果i的二进制表示中的最高位为1,则~i会得到一个负整数。

当i的二进制表示中的最高位为0时,即i为正整数,~i不等于-1。因为-1的二进制表示中的所有位都是1,而~i会将i的所有位取反,因此结果会是一个非-1的负整数。

当i的二进制表示中的最高位为1时,即i为负整数,~i也不等于-1。因为-1的二进制表示中的所有位都是1,而~i会将i的所有位取反,结果会是一个正整数。

综上所述,~i并不等同于i != -1。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

真的了解 i++, ++ii+++++i 以及 i+++i++

本文字数:2355字 阅读本文大概需要:6 分钟 我想大部分都知道 i++ 和 ++i的区别,i++ 就是先拿i来使用,之后再自增加1,而++i则是先自增加1,在拿i来使用,例如对于下面这两个语句,...我敢保证大部分人都会做: int i = 1; System.out.println(i++) int i = 1; System.out.println(++1) 答案分别为 1,2。...“1”的变量加1,即把 i1。...所以虽然i已经等于2了,但此时栈顶的元素却是i之前的值 1 ,所以打印的是1。 这下关于 i ++ 的懂了吧? 那我们来看看 ++ ii ++ 的汇编指令有什么不同。...int i = 1; System.out.println(++i); 对应的部分重点汇编指令如下: //和上面i++差不多,不过IINC 1 1 和ILOAD 1这两句的顺序调换了。

2.7K20
  • 面试官:【int i = 6; i += i - 1; 】i 等于什么?

    表达式解析:i += i - 1; 这一行等价于 i = i + (i - 1);。i - 1:当前 i 的值是 6,因此 i - 1 计算结果为 6 - 1 = 5。...Java 是一种严格从左到右求值的语言,这意味着:当执行 i += i - 1; 时,右侧表达式 i - 1 首先被计算,然后将结果赋值给 i。...具体来说,i - 1 的值是基于 i 的当前值来计算的,而这个计算过程不会影响当前 i 的值。详细过程:第一步:i 的初始值为 6。第二步:先计算 i - 1。...变量和赋值机制Java 的赋值机制是右结合的在 i += i - 1; 中,表达式右侧 i - 1 的计算先于赋值进行。...延迟赋值:在表达式 i += i - 1 中,只有在 i + (i - 1) 的所有计算完成之后,结果 11 才会被赋值给 i

    25920

    For循环中,只能`i++`或者`++i`

    var count=0; var count1=1; for(var i=1;i<=99;i+2){ count+=i; } document.write("1~99中的奇数的和是"+count...很明显,这是死循环了,但是不应该啊,难道是i+2的问题? 于是搜索过后,恍然大悟。 因为i++,是有自加功能的,它的含义是i=i+1的缩写,它有两层含义,一是i+1,二是把得到的值再复赋值给i。...而单纯一个i+1没有赋值功能,加完以后,i的值还是原值,加上1,毫无意义。 一般的c语言程序,碰到你写的i+1或者是sum+1这样的式子,代码都会正常运行而不会报错,只是达不到预期的目的而已。...总之,不管出不出现错误提示,你写成i+1或者是sum+1毫无用处,也不会起到任何作用,它不能代替i++,或者sum++。...i++不是单纯+1,他存在了一个过程,i = i + 1,而这样就不是直接赋值。 至于为什么i + 2不行,因为他是一步到位,循环中这样i的值是没有任何变化的!

    57510

    ++ii++仅仅是先加1和后加1的区别

    但是如果我告诉你,后置++ 其实与前置++一样,在参与运算之前都会将变量加1,你会信?...哈哈,鬼才信呢,那我告诉你这是真的..... public class PreAndPostPlusDemo { public static void main(String[] args) {...,这里局部变量1就是 //程序中的变量i,也就是将刚才压入栈的0弹出,赋值给变量i //这两个指令相当于执行(int i=0;) 1: istore_1 //将局部变量1中存储的int类型值压入栈,即将...i的值0压入栈, //这在程序中就相当于将i的值赋给一个临时变量temp,此时temp的值为0 2: iload_1 //将局部变量1的值加1,也就是将i的值加1.在程序中这个相当于(i+=1;) //...//这两天指令相当于执行(int i=0;) 1: istore_1 //将局部变量1的值加1.也就是将i的值加1.

    1.6K20

    快看,i++真的不安全

    上期文章讲到“i++;”本身是一个线程不安全的操作,原因是操作不是原子性的,存在取值和赋值的两个过程,但是究竟怎么会不安全呢?本期借助一个“vmlens”的项目来演示为何会发生线程不安全的情况。...从图中我们可以看出在两个线程同时执行“i++;”的时候,两个线程都先后读取到了i的值“0”,然后先后完成了计算“i+1”,最后又先后给i赋值“1”,导致测试用例执行失败。...1. 需要测试多个线程访问相同内存位置或监视器的应用程序的所有部分。vmlens显示多个线程访问相同内存位置或监视器的所有位置。...It always bothers me when I can not test something....That's why I created vmlens, a tool to test multithreaded java.

    40230

    String str=i与 String str=new String(“i”)一样

    在大多数情况下,String str = "i" 和 String str = new String("i") 是等效的,它们都创建了一个包含字符 "i" 的字符串对象。...1.字符串池:在Java中,字符串池(String Pool)是一块特殊的内存区域,用于存储字符串常量。...下面是一个示例,演示了上述差异:String str1 = "i";String str2 = "i";String str3 = new String("i");String str4 = new String...("i");System.out.println(str1 == str2); // trueSystem.out.println(str3 == str4); // false在这个示例中,str1...总结起来,尽管 String str = "i" 和 String str = new String("i") 在大多数情况下会产生相同的结果,但它们在内部的处理方式上有所不同,这可能会对一些特定的使用场景产生影响

    22000

    字节跳动面试官:i++ 是线程安全的

    >Thread2 1、不用 volatile 假如ready字段不使用volatile,那么Thread 1对ready做出的修改对于Thread2来说未必是可见的,是否可见是不确定的.假如此时thread1...,会发现 void f1() { i++; } 的字节码如下 void f1(); Code: 0: aload_0 1: dup 2: getfield #2; //Field i:I 5: iconst..._1 6: iadd 7: putfield #2; //Field i:I 10: return 可见i++执行了多部操作, 从变量i中读取读取i的值 -> 值+1 -> 将+1后的值写回i中,这样在多线程的时候执行情况就类似如下了...Thread1 Thread2 r1 = i; r3 = i; r2 = r1 + 1; r4 = r3 + 1; i = r2;...i = r4; 这样会造成的问题就是 r1, r3读到的值都是 0, 最后两个线程都将 1 写入 i, 最后 i 等于 1, 但是却进行了两次自增操作 可知加了volatile和没加volatile都无法解决非原子操作的线程同步问题

    47120
    领券