1、int转byte
首先,计算机里都是以补码形式存储的;
补码:
- 正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1。
int 4个字节 32位;
byte 1个字节 8位;
int --》byte会截取int的后8位,截取后,第一位(符号位)为1(负数),求符号位之后7位的补码,转为10进制即最终结果。
int 200 转为 byte
十进制:二进制
200:0000 0000 0000 0000 0000 0000 1100 1000
截取后八位:1100 1000 (符号位位1,即负数)
求后7位的补码,取反加一得
:011 1000:56----》加上符号位 1011 1000 即:-56
int 300 转为 byte
300:0000 0000 0000 0000 0000 0001 0010 1100
后八位: 0010 1100 (正数)
即:0010 1100:44
2、++、- -
加加和减减
在前就先赋值再运算,在后就先运算再赋值
int a = 5;
int b = (++a)+(a++)+(++a);
(++a):此时 先赋值 a=6 、再运算 (++a)=6;
(a++):此时 先运算(a++)=6 、再赋值 a=7;
(++a):此时 先赋值 a=8 、再运算 (++a)=8
即 6+6+8=20
3、“+=”、“-=”
a = a+b;
a+=b;
这两个表达的意思是一样的;
但是+= 会自动转换类型(强转),会损失精度
int a = 5; byte b = b + a;会编译错误,因为int转byte需要强转
byte a = 5; byte b +=a;没错,但是会损失精度,因为他的结果自动强转成byte类型了
4、&&、&、||、|
&&和|| 具有短路性
-----&&:第一个false,第二个就不会再判断
-----||:第一个true,第二个也不会在判断
&和|:
-----全判断
5、位运算
&:按位与 如果相对应位都是1,则=为1,否则为0
(A&B)
--------------------------------------------------------------------------------------------
|:按位或 如果相对应位都是0,则=为0,否则为1
(A | B)
--------------------------------------------------------------------------------------------
~:按位非 按位取反运算符翻转操作数的每一位,即01互换
(〜A)
--------------------------------------------------------------------------------------------
^:按位异或 如果相对应位值相同,则=为0,否则为1
(A ^ B)
--------------------------------------------------------------------------------------------
<<左位移运算符 左操作数按位左移右操作数指定的位数。
A << 2
--------------------------------------------------------------------------------------------
>>右位移运算符 左操作数按位右移右操作数指定的位数
A >> 2
----------------------------------------------------------------------------------------------
\ \ 左操作数的值按右操作数指定的位数右移 \
>>> 无符号右移 移动得到的空位以零填充
A>>>2
----------------------------------------------------------------------------------------------
优先级S:~ 波浪
优先级A:<<、>>和>>>
优先级B:&
优先级C:^
优先级D:/
*/
我为什么要它?
答案1:位运算的运算效率比直接对数字进行加减乘除高很多(至于为什么会快,不明白的可以去搜下为什么C的代码执行速度比Java,python快),代码需要考虑性能的时候
答案2:因为大牛都喜欢这样,估计是炫技吧!
使用
-
场景1:判断奇偶数 a&1 结果为 0 ,a就是偶数 结果为 1 ,a就是奇数
-
场景2:求平均数 (x+y)/2 这样吗?考虑过 x+y可能超过int的范围吗?正确的姿势是 (x&y)+((x^y)>>1)
-
场景3:有两个int类型变量x、y,要求两者数字交换,不用临时变量?(当年学java的时候这可是奥数级别的题目)
x ^= y; y ^=x; x ^= y; -
场景4:求绝对值
int abs( int x ) { int y= x >> 31 ; return (x^y)-y ; //or: (x+y)^y }
-
场景5:取模 a % (2^n) 等价于 a & (2^n - 1)
-
场景6:快速乘法 a * (2^n) 等价于 a << n
-
场景7:快速除法 a / (2^n) 等价于 a >> n
-
场景8:求相反数 (~x+1)
总之,整型所涉及到的操作它都可以更快速的实现,有兴趣可以仔细研究。
(转自:https://www.cnblogs.com/yuanhailiang/p/9479105.html)
1是对 0是错
1是负数 0是整数
& 与运算:只有1 1 是 1,其他都是 0
6、赋值要点
》整数常量默认是int
如果要使用long范围的数字,赋值时在数字后面加字母L(不在long的范围可以不加,int转long自动转)
》小数常量默认:double
如果要表示4个字节的小数,需要使用float,定义时在小数后加字母F
》赋值语句中:小转大自动转,大转小要强转
float a = 2.0;//向下转型,double --》 float
float a1 = 2.0f;
double b = 2.0; //正确 double – double
int c = 2; //正确 int <-- int
long d = 2; //正确;long <-- int
int f = 2.0;//int <-- double 错
int g = 2L; //错误:int <-- long
byte e = 127;//给byte赋值 127及以下都不报错??? byte <-- int ???
为什么给byte赋值为int 编译能通过呢?
注意:
byte, short, int, long这些整数默认都是int型,都是以int型计算的,只要不超过他们的取值范围就可以进行赋值。
byte 为1字节 -128~127
short为2字节 -32,768~32,767
int为4字节 -2,147,483,648~2,147,483,647
long 为8字节 -9,223,372,036,854,775,808L~9,223,372,036,854,775,807L
而char为2字节 0~65535
*/
位运算交换两个变量的值
首先有个原理需要知道:
若a^b=c,则c^b=a,c^a=b
可通过穷举法进行证明

引自:https://blog.youkuaiyun.com/qq_22986837/article/details/53413454
那么就可以通过以下方式进行两个变量的交换
a=a^b; 此时a为 c
b=a^b; 此时 b = c^b = a
a=a^b; 此时 a = c^a = b
即
a ^= b; b ^=a; a ^= b;
494

被折叠的 条评论
为什么被折叠?



