小代码大学问之JavaScript位运算

原文:http://www.basecss.net/article/mini-code-with-great-learing.html

 

这几天粗略的阅读了一下AngularJS的源码,在这个过程中发现有这么两段代码挺有意思的:

这两段代码用来处理字母大小写转换,由于某些国家(土耳其)使用toLowerCase()toUpperCase()不能正确的转换字母大小写,因而需要手动的处理。

为什么说这两段代码有意思?其实是觉得其中用位运算处理字母大小写的代码很巧妙,其核心代码如下:

在分析两段代码之前,先来回顾一下JavaScript中的两个概念:整数位运算

从严格意义上讲,ECMAScript中有两种类型的整数:有符号的整数(正数和负数)和无符号的整数(只有正数)。而默认情况下JavaScript中的整数都是有符号的。

而在不考虑ECMAScript中数字格式存储与转换(为32位)的情况下,实际上我们操作的都是32位的整数。而对于上面提到的有符号整数而言,其中前31位(end<-start)表示数字的值,最后1位表示符号位(0表示正,1表示负)。

这里提到的32位的整数在计算机底层都是使用二进制格式存储的,而这个二进制由01组成,其中每一位都有对应的十进制数字结果,整个二进制数值代表的十进制结果由所有这些位对应的十进制数字之和。

这篇文章中不考虑负数的情况,一个32位二进制格式的数字看起来如下所示,这里以10为例: