利用這段代碼
color = "#"+ (Math.random()*0xffffff<<0).toString(16);
實現了隨機得到顏色
但是實在不明白為什麼?
這裡有解釋到一點 但也不明白
http://www.cnblogs.com/rubylo...
基本实现4的改进,利用左移运算符把0xffffff转化为整型。这样就不用记16777215了。由于左移运算符的优先级比不上乘号,因此随机后再左移,连Math.floor也不用了。
如果x.abcd << 0 這樣也可以得到整數 x ,那又和Math.floor(x.abcd) 有什麼差別呢?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
这种问题,看规范就知道啦
移位运算在内部是啥样的?
关键就是我标红的那一步,这一步会把变量
lval做ToInt32的运算,而这个lval就是来自我们移位运算的左值,就是你的999.222。接下来,再来看看
ToInt32做了啥:关键的那步我也给你标出来了,这里会把输入值直接取整。
所以,给一个浮点数做0的移位运算,结果就是取整。
对于
Math.floor,规范没说具体实现,只给了一句话——Math.floor的实现没给出,但是移位取整中间还多了好几个步骤,除了写代码的时候能稍微简洁一点以外,我觉得还是Math.floor更好点。另外,
ToInt32里面的那个floor运算是这么实现的:modulo是取模运算的意思,x对1取模,那就是求x的小数部分,随后x剪掉了自己的小数部分,那就剩下整数了嘛。必须要注意的是,
ToInt32中是先取绝对值然后再取整的,所以在负数区间内,<< 0和Math.floor的结果是不一样的。Math.floor返回的是不大于输入值的最大整数,那么肯定就有Math.floor(-1.5) = -2。而对于
<< 0运算,它是先取绝对值,然后取整,最后再把符号弄回去,那么就有-1.5 << 0 = -1。不了解这个运算符原理,但是之前看到过~~这个运算符的用法,试了一下发现类似


都是对负数相当于
Math.ceil对正数相当于Math.floor会快,但是写法比较hack
位运算的安全值是32位整数,超过32位的会被忽略,小数部分也被忽略
x.abcd << 0直接丢弃了小数部分 ,Math.floor(x.abcd)向下取整,它们的算法不同当x.abcd为负数时就能区分开了,如:
-5.8<<0; //5Math.floor(-5.8); //-6