Java基础

Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^) 
位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面详细介绍每个位运算符。


1.与运算符
与运算符用符号“&”表示,其使用规律如下:
两个操作数中位都为1,结果才为1,否则结果为0。
“a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即(a&b)=128。


2.或运算符
或运算符用符号“|”表示,其运算规律如下:
两个位只要有一个为1,那么结果就是1,否则就为0。
a 的值是129,转换成二进制就是10000001,而b 的值是128,转换成二进制就是10000000,根据或运算符的运算规律,只有两个位有一个是1,结果才是1,可以知道结果就是10000001,即(a|b)=129。


3.非运算符
非运算符用符号“~”表示,其运算规律如下:
如果位为0,结果是1,如果位为1,结果是0。
a 非的结果是:-3
00000010,逐位取反得,11111101,除第一位符号位外逐位取反得,10000010,加1,最后得10000011,转换成十进制得-3

 
4.异或运算符
异或运算符是用符号“^”表示的,其运算规律是:
两个操作数的位中,相同则结果为0,不同则结果为1。
分析上面的程序段:a 的值是15,转换成二进制为1111,而b 的值是2,转换成二进制为0010,根据异或的运算规律,可以得出其结果为1101 即(a^b)=13。

 

 

再看JDK源码的时候发现,“死循环”有两种写法:for(;;)和while(true),

我就疑问,两者有啥区别,有啥源码中多数是for( ; ; )这种形式的,

编译前              编译后 
    while (1);         mov eax,1  
                                              test eax,eax 
                                               je foo+23h
                                               jmp foo+18h


        编译前              编译后 
    for (;;);          jmp foo+23h   

一目了然,for (;;)指令少,不占用寄存器,而且没有判断跳转,比while (1)好。

也就是说两者在在宏观上完全一样的逻辑,但是底层完全不一样,for相对于来说更加简洁明了。

 

 

 

关于Java中指针的探讨

引用和指针还是差别的。
C中的指针还可以进行运算,比如p++,但Java中的引用绝对不可以。

java内部有,比如对象内部有指向方法的方法指针等,但java中不能直接操作指针,把指针的操作封装了,比如封装成引用,所以java的地址操作更加安全。

java的引用明明和指针没什么本质区别,java为什么还宣称没有指针并把这个当作语言的优点? 
java声称没有指针,但给我的感觉是根本所有变量都是指针在控制,只不过很多指针的功能被限制了,这怎么能算没有指针呢?

java的引用是c/c++用指针实现的,但不是说java语言本身需要指针。
为什么java语言要用c/c++来实现?因为这个语言是我们用的冯诺依曼结构计算机的直接映射。
为什么可以不用c/c++?因为我们的应用可以跑在抽象结构上,这个结构上不需要指针。
还有不需要指针的结构吗?当然,丘齐体系。
还有用c/c++(包括指针)实现的其他无指针的语言吗?当然,python,haskell,ocaml。

补充:忘了说一句,指针在冯诺依曼结构上直接映射的是间接寻址(什么是间接寻址?)
 

1: java有指针,在java中称为 引用。 所谓的引用就是内存地址的值。拿到该引用就相当 于得到了该内存处的对象。

2: java中可以使用指针(我们称之为引用),但不能修改引用。  如C++中可以 进行pointer++; 在java中是错误的。(Integer,Float等包装类除外,因为java有自动封箱、解箱特性)。  这就好比:在java中可以坐飞机到指定的目的地,但是你不能开飞机(安全)。但是在C++中可以自己开飞机(操作飞机)--具有危险性。


它没有显式的使用指针,其实Java语言内部的实现机制来说是肯定有指针的,用不用一样东西是看有没有必要去用。Java是一个纯面向对象的语言,基本上来说,程序员不需要关心内存的分配与释放的操作(jre、虚拟机帮忙做了),既然不关心内存那么没必要引入指针这么种相对复杂而容易重大错误的一种形式。其实Java里边充斥着引用的说法,从某种角度上说,引用就是指针的简化版。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值