(function () {
var names = [];
return function (name) {
addName(name);
}
function addName(name) {
if (!~names.indexOf(name))//如果存在则不添加
names.push(name);
console.log(names);// ["linkFly"]
}
}())('linkFly');
if (!~names.indexOf(name)) 中的操作符”!~” 什么意思,不理解,先从~入手。
测试可以得出结果值有这个的规律 -(X+1)
搜索一番,有的文章只丢一句:按二进制位取反
从字面意思,这里用八位二进制表示:3=00000011,那~3=11111100,套上面公式不对呀。
上面解释还是太过抽象不具体。其实这涉及到原码、反码、补码的知识。原码
原码表示法最高位为符号位,该位为0表示正数,1表示负数。其余位表示数的绝对值。
反码
对于一个带符号的数来说,正数的反码与其原码相同;负数的反码为其原码除符号位以外的各位按位取反。反码常用来做求补码过程中的中间形式。
补码
正数的补码与其原码和反码相同;负数的补码是对它的原码除符号位以外各位取反,并在末位加1而得到,即为该数的补码加1。计算机内的数一般以补码形式表示。在补码中用(-128)D代替了(-0)D,注意:(-128)D没有相对应的原码和反码,(-128)D = (1000,0000)B。
求补运算
求补运算不考虑符号位,对它的原码各位取反,并在末位加1而得到。对一个数进行求补运算所得的是该数相反数的补码。拿作者文章例子,理解下
~是按位取反的意思,取反就是如果是00111,则变为11000 (按位取反)
57的二进制表示为(1个字节):00111001
按位取反后(~57)的二进制: 11000110 此表示为十进制:-70
这是一个负数,是有符号的数,负数在计算机里要用其补码来表示:补码=符号位以后按位取反再加1.
所以-70(11000110)符号位以后按位取反后为(10111001) 再加1 则为(10111010)
换成十进制为:-58
因此~57=-58至此算是终于搞明白了。虽然总结的公式能快速得出结果,但不能解释为什么,作为技术人我们喜欢钻研,深入细节。
感叹时间:
正如作者的标题中所说最基本也最容易忽略的东西,混了几年连基本都没了,被人问到得贻笑大方。
基础是一切上层的基石,潜心修道,路漫漫。
按位与(&)按位或(|)按位异或(^)按位取反(~)左移(<<)右移(>>)
基础知识:
1. and(&)运算 (按位与)
and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数.
相同位的两个数字都为1,则为1;若有一个不为1,则为0。
00111
11100
(&或者and)
—————-
00100
2. or(|)运算 (按位或)
or运算通常用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
相同位只要一个为1即为1。
00111
11100
(|或者or)
—————-
11111
3. xor(^)运算 (按位异或)
异或的符号是⊕。
xor运算通常用于对二进制的特定一位进行取反操作,因为异或可以这样定义:0和1异或0都不变,异或1则取反。
xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥。1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,得到1314520,于是她就明白了我的企图。
相同位不同则为1,相同则为0。
00111
11100
(^或者xor)
—————-
11011
4.~取反就是如果是00111,则变为11000 (按位取反)
~是按位取反的意思.
57的二进制表示为(1个字节):00111001
按位取反后(~57)的二进制: 11000110 此表示为十进制:-70
这是一个负数,是有符号的数,负数在计算机里要用其补码来表示:补码=符号位以后按位取反再加1.
所以-70(11000110)符号位以后按位取反后为(10111001) 再加1 则为(10111010)
换成十进制为:-58
因此~57=-58
5.>>是右移位运算
右移1位即除以2;,并且取整。
m_Height>>4相当于:
m_Height/16<<是左移位运算
若左移一位,则其数值变为 a*2
exempli:
今日又看到这样的表达,a|=b ,意思是a=(a|b),这与 a+=b有点类似。例子如下:
int
a =
1
,b =
2
,c =
4
;
//0x0001,0x0010,0x0100
a |= b;
// a = 0x0011 = 3
b |= c;
// b = 0x0110 = 6
今天的文章!~是什么分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/57847.html