一、+ - * / %
【+:当+遇到字符串的时候 不再代表算术加法 而是追加链接,只要+两面有一面是字符串就是追加链接,但是若都不是就是算术加法】
【*: 注意容易溢出】
【/:整数除以整数结果一定是整数,取整】
【%:最终结果的符号位 取决于参与运算的第一个数 即第一个数是整数结果就是正,第一个是负结果就是负。与第二个数无关】
二、+= -= *= /= %=
【这些运算符能够保证左侧的数据类型不发生任何变化====》即这里有一个隐藏式的强制类型转换变成运算符左侧的数据类型】
三、++ --
【a.取值 b.运算 x++/x-- ab 先取值在运算 ++x /--xba 先运算在取值】
x=15 y=1
x++ + --y - ++x + y++ =32 运算之后x=17 y=1
四、&& || & | 【逻辑运算符】
【&&与|| 逻辑短路运算符 他们具有短路特性,只要能判断出对或错是后面的就不再进行判断】
【&与| 逻辑非短路运算符 不管能不能判断出来全部都会判断一遍】
五、& | ^ ~ [按位运算符]
& 按位与 两个数写成二进制上下对齐,同为1结果为1,否则为0。
10 27 52 12 58
%2 0 1 0 0 0
&1 0 1 0 0 0
%4 2 3 0 0 2
&3 2 3 0 0 2
*: %2 %4 %8 %16 ...
&1 &3 &7 &15 ...
由上面几组数据可知n%2=n&1,n%4=n&3,n%8=n&7,n%16=n&15依次类推可以得到n%2(x)=n&2(x)-1;
| 按位或 有1就为1,全0才为0.
0000110101
| 1101010011
1101110111
^ 按位异或
只有不同为1,相同为0。
0000110101
^ 1101010011
1101100110
IBM 笔试题 [禁止使用第三块空间] 交换两个变量的值,不使用第三个变量的四种法方
int a = 3;
int b = 5;
方一:
a = a ^ b;//a = 6 110
b = a ^ b;//b = 3 011
a = a ^ b;//a = 5 101
理解:三个按位异或:
第一步是两个变量按位异或复制给第一个变量。
第二部这个被赋值的变量与第二个变量按位异或便得到第一个变量的初始值复制给第二个变量,这样第一个变量例存的还是两个变量的异或结果,第二个变量里就是第一个变量了。
然后第三步,将第一个变量与第二个变量再次异或,得到的便是第二个变量,赋值给第一个变量。
总的来说,两个变量异或得到的就是两个变量的不同点,这个不同的数值与两个变量任意一个得到的都是另外一个变量。这个方法就是利用了这一点,现将a,b的疑惑赋值给a,然后a在于b异或(因为b还是原来的b,而a已经被赋值改变了)就得到了最初的a,赋值给b。此时b里存的是最初的a,a里存的是a,b异或,然后a在于b异或就得到最初的b,赋值给a。这样a,b就交换了。
方二:
a = a + b;//a = 8
b = a - b;//b = 3
a = a - b;//a = 5
~ 按位非
按位“非”操作符,属于一元操作符,只对一个操作数进行操作,(其他按位操作符是二元操作符)。按位“非”生成与输入位相反的值,——若输入0,则输出1,若输入1,则输出0。
六、>> << >>> [位移运算符]
<< : 左移运算符,num << 1,相当于num乘以2
>> : 右移运算符,num >> 1,相当于num除以2
>>> : 无符号右移,忽略符号位,空位都以0补齐