數字系統
數學運算
位元運算
比較運算
邏輯運算
做運算之前先來點前前情提要...
重點A: 數字進位法
重點B: 數字表現實作
2進位
8進位
10進位
16進位
電腦使用的基本進位法
可用符號:0,1
前綴字:0b,0B
0b11010010
1x27+1x26+1x24+1x21
用在檔案權限管理
可用符號:0~7
前綴字:0
0755
7x82+5x81+5x80
給電腦用還得另外處理
...
用來表現2進位數
0xF vs 0b1111
可用符號:0~9,A~ F
前綴字:0x,0X
0xDEADFACE
13x167+14x166+10x165+13x164+ 15x163+10x162+12x161+14x160
有號整數
無號整數
浮點數
0b01101110 正數
0b10010001 1的補數
0b10010010 2的補數
至少知道關鍵字可以上網查
使用2的補數
有1,2,4,8位元組的整數實作
數字範圍:-2(位元數-1)~2(位元數-1)-1
大部份的語言實作有號整數的方法
直接表達該數字
有1,2,4,8位元組的整數實作
數字範圍:0~2位元數-1
沒有負號,非常正向
IEEE 754
分為三部份:符號、指數、尾數
利用科學記號的方法表現數字
使用console.dir(obj)觀察
0.1+0.2
987654321+0.123456789
!!記得浮點數沒有稠密性!!
Number
使用IEEE754雙精度64位元浮點數作為實作
符號 | 指數 | 尾數 |
---|---|---|
1 | 11 | 52 |
實際對數字進行運算啦~~
也可以對非數字NaN進行運算
加
減
乘
除
取餘數
var a=0x16+10+010
a+=0b1100
NaN,Infinity做加法仍保持原樣
var b=0x7f-255
b-=3
試試看Inifity減去Infinity
NaN是最強的
先乘除後加減
var c=15+3*5
c*=2.5
毫無反應,只是個NaN和Infinity
一樣先乘除後加減
var d=15+6*5/15
d/=1.7
0除以0為NaN,其他數除以0為正負無限大
此運算也是先乘除後加減
var e=5+3*3%2*5
e%=0.2
!!注意浮點數的誤差又出現了!!
萬惡的++以及--
使用Math物件
C語言統治世界啦!!
var a=b=1
c=a++
d=++b
能不要用就不要用...
console.dir(Math)
以下內容按讚即可閱覽
當然還是要說明一下啊~~
Math.PI
Math["SQRT1_2"]
Math['SQRT2']
記得Math是個物件
角度吃弳度量
記得使用Math.PI
sin,cos,tan,csc,sec,cot
另有反三角函數回傳弳度量
Math.log(n)
Math.log2(n)
Math.log10(n)
記得底數的不同
Math.pow(x,y)
取得x的y次方
Math.pow(10,64)
也可以用來開方根
Math.pow(256,0.125)
JS的浮點數還有更加困難的挑戰...
以二進位法對位元進行操作
不是說JS是用浮點數嗎??
先轉換成32位元整數運算後再轉回來...
反
且
或
互斥或
左移,右移
一元運算子
~0xff
把各位元位反向
0b1100&0b1010
2147483648&0x80000000
絕對不是BUG,這是功能
0b1100|0b1010
Math.pow(2,31)|1
正正得負...
可以用來做簡單的加密解密
0b1100^0b1010
放棄吐嘈了...
將位元往左邊移動
相當於乘以2
1<<32
最大可以左移31
將位元向右移動並維持符號
相當於整數除法除以2
-0xFF1111>>16
-0xFF0000>>16
對於負數的計算要小心
將位元右移左側補0
部份相當於整數除法除以2
2147483648>>16
2147483648>>>16
聰明的你是否不知道答案呢?
在JS中位元運算就是坑
那為何我還要說明
???
因為別的語言會用到...
JS恐怖的地方又來了...
JavaScript驚魂夜
分成嚴格相等(===)與相等(==)
張大眼睛看仔細
會轉換成相等型別再比較
"1"==1
undefined==null
儘量不要使用...
先比較型別是否相等
再比較非number的值是否相等
比較number是否相等或為正負0且兩者不為NaN
相近於強型別語言的相等運算
不相等,嚴格不相等
大於,大於等於
小於,小於等於
會轉型再比較是否不相等
"2"!=2
"1"!=true
反正也是很難用啦~~
不轉換型別直接比較
比較法類似於嚴格相等
誠心推薦保證不騙
一樣有型別轉換
"100">"99"
"100">99
用在同類型的比較運算就好
還是有型別轉換
null<0
null==0
null<=0
太恐怖了...
剩下簡單的邏輯運算
應該比上面講的簡單很多了...
反向(!)
且(&&)
或(||)
互斥或(^)
~ | 1 | 0 |
---|---|---|
0 | 1 |
當前面條件不滿足後面就不看
節省不必要的浪費
&& | 1 | 0 |
---|---|---|
1 | 1 | 0 |
0 | 0 | 0 |
|| | 1 | 0 |
---|---|---|
1 | 1 | 1 |
0 | 1 | 0 |
^ | 1 | 0 |
---|---|---|
1 | 0 | 1 |
0 | 1 | 0 |
Mozilla Developer Network
w3schools