Java运算面试题及>>、>>>位运算

文章详细阐述了Java中自增自减运算符的执行顺序,例如`a++`和`++a`的区别,以及自增自减赋值运算如`c=a++`和`d=++a`的差异。同时,讨论了字符串拼接与数值计算的结合,以及数据类型自动转型规则。此外,文章还深入讲解了位运算,包括与(&),或(|),异或(^)操作,以及左移(<<),右移(>>)和无符号右移(>>>)的用法,并举例说明了二进制与十进制之间的转换,特别是负数的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、自增自减运算

自增自减与赋值的执行先后顺序

// ++  自增 表示原有数据+1
int a = 10;
a++;
System.out.println(a) //a = 11;
// --  自减 表示原有数据-1
int b = 10;
b++;
System.out.println(b); //a = 9;
//自增赋值
a =10;
int c = a++;   //执行顺序: c=a;a=a+1; 先赋值再自增
System.out.println("c:"+c+"\t a:"+a);c:10  a:11 
a = 10;
int d = ++a; //执行顺序: a=a+1;d=a 先自增再赋值
System.out.println("d:"+d+"\t a:"+a);c:11  a:11

//在输出语句时需要注意
a=10;
System.out.println(a++);  // 10
a=10;
System.out.println(++a);  // 11
//思考问题
int i = 1;
int k = i+++i * i++;   //1+2*2=5
//计算顺序和计算结果,i的结果???
// k =5; i = 3;  

加“+”连接符

int a = 5;
int b = 6;
System.out.println(a+b+""); //11 先计算在拼接""
System.out.println(""+a+b); //56 a拼接"",作为字符串再拼接b

赋值运算

// 数据类型自动转型 byte,short、char类型的数据参与计算
byte a = 2;
short b =3;
char d ='a';

int sum1 = a+a; 
int sum2 =a+b;
int sum3 = b+d; 
int sum4 =a+10;
//byte,short、char类型的数据参与计算,结果输出的类型都是int

//思考问题??
a+=1; //此时a是什么类型的数据  byte
b*=100; //b是什么类型的数据  编译通过,内存溢出

//a += 1; 会被编译为:byte a = (byte)(a + 1);而 a = a + 1 呢?编译时会报错。因为 1 默认是 int 类型 byte + init 类型会隐私转换为 int 类型,将 int 类型直接分配给 byte 类型就会报错

位运算

void  testMode3(){
    //位运算  &  与  | 或  ^  非  ~ 取反

    /*
    A = 00111010
    B = 00101000
    
    A&B = 00101000         二进制,在相同位置比较,两个数都为1,结果输出1   1&1 ==》1
    A|B = 00111010         二进制,在相同位置比较,两个数只要有一个为1,结果输出1 1||0 ==》1
    A^B = 00010010         二进制,在相同位置比较,两个数相同结果为0,不相同结果为1
    ~B= 11010111            二进制,在相同位置处取反,0-》1 1-》0
    ----------------
   <<  左移     相当于 *2           不管正负数
   >>  右移     相当于 /2
   >>=   复合运算,移位后将移位后的值赋值给移位前的值。
     如: k = 8;  j=k>>2 ; 计算结果j=2但是k仍等于8 ;
     k>>=2; 计算结果是2;k的值最终等于2
     */
    System.out.println(8<<2);  //32          8*2*2
    System.out.println(8>>2);  //2           8/2/2
    System.out.println(2>>2); //0            2/2/2
    /*
       >>>     右移     
       1)正数相当于  >>   
       2)负数是先获取负数的原码--》反码--》反码+1得到补码;
       对补码进行位移,左侧补0,左侧舍弃
注意:Java程序中负数十进制转二进制是按照32位来计算的
     */
     注意:Java程序中负数十进制转二进制是按照32位来计算的
>>> 对于正数的计算,相当于 >>
对于负数的计算
1)将十进制负数转换成带符号的二进制原码 如:-24      》》 1000-0000 0000-0000 0000-0000 0001-1000 (原码)
2)获取它的反码 								  》》   1111-1111 1111-1111 1111-1111 1110-0111       (反码)
3)获取补码,在其反码的基础上加1                   》》   1111-1111 1111-1111 1111-1111 1110-1000       (补码)

-24>>>3
1111-1111 1111-1111 1111-1111 1110-1000       (补码) 左移3位,左侧补0,右侧舍弃
---1111-1111 1111-1111 1111-1111 1110-1(000)
0001111-1111 1111-1111 1111-1111 1110-1              最终结果转换成
}

二进制转十进制

负数十进制转二进制
1)先不考虑负数,十进制转二进制
2)对二进制取反
3)取反后的二进制加1
例:-5转化成二进制数----------->11111011
1、(十进制)5=(二进制)00000101
2、(二进制)00000101逐位取反为:11111010
3、二进制数+1得:11111011
二进制的负数转为十进制
1)将二进制减1
2)对二进制取反
3)取反后换算成十进制
例:用逆向操作将二进制的负数转为十进制。11101101(二进制负数)转换成十进制。
1、将二进制数减1,得到:11101100。
2、将得到的11101100取反:得到:00010011
3、取反转换成十进制,得到19。在计算结果19的基础上要加上-号,即-19才是最终结果!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值