JavaScript的 关于二进制的先关使用

基础点

位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值。

对于有符号的整数,32位中的前31位用于表示整数的值。第32位用于表示数值的符号:0表示正数,1表示负数。

这个表示符号的位叫做符号位。例如,数值18的二进制表示是00000000000000000000000000010010,或者更简洁的10010。

 


位运算------》常规

因为 js 的整数默认是带符号正数,所以在为运算中,只能使用 31 位(0~2147483647),开发者是不能访问最高位的。

位运算只发生在整数上,因此一个非浮点数参与位运算之前会被向下取整。


按位与(&):两个数的相同位,都是 1 返回1 ,否则返回0

123&234 = 106

    123  "00000000000000000000000001111011"

    234  "00000000000000000000000011101010"



    106  "00000000000000000000000001101010"

按位或(|):两个数的相同位,有一个是 1 则返回 1 ,否则返回 0

123|234 = 251

    123  "00000000000000000000000001111011"

    234  "00000000000000000000000011101010"

---------------------------------------------

    251  "00000000000000000000000011111011"


按位异或(^):两个数的相同位,一个是 1 另一个是 0 则返回 1,否则返回0

123^234 = 145

    123  "00000000000000000000000001111011"

    234  "00000000000000000000000011101010"

---------------------------------------------

    145  "00000000000000000000000010010001"


左移位(<<) : 一个数的二进制所有位向左移动,符号位不动,高位溢出丢弃,低位补 0

      如果不溢出, 左移位的效果是乘以 2。

右移位(>>): 一个数的二进制所有位向右移动,符号位不动,高位补0,低位丢弃 

     右移位操作的效果是除以 2 并向下取整。



位运算------》使用举例

一些要注意的地方:

位运算必须是整数,如果运算元不是可用的整数,将取 0 作为运算元

对浮点数向下求整,我们会用下面的方法:

varnum =Math.floor(1.1);// 1

我们也可以用位运算来求整:

varnum=1.1|0;// 1

其实浮点数是不支持位运算的,所以会先把1.1转成整数1再进行位运算,就好像是对浮点数向下求整。所以1|0的结果就是1。



判断一个数是奇数还是偶数,我们会用求余数来判断:

functionassert(n){if(n %2===1) {    console.log("n是奇数");    }else{    console.log("n是偶数");  }}assert(3); //"n是奇数"

我们也可以用一个数和1进行按位&操作来判断,而且速度更快

functionassert(n){if(n &1) {    console.log("n是奇数");}else{    console.log("n是偶数");}}assert(3); //"n是奇数"


有符号左移(<<)

有符号左移会将32位二进制数的所有位向左移动指定位数。如:

varnum=2;// 二进制10num=num<<5;// 二进制1000000,十进制64

如果要求2的n次方,可以这样:

functionpower(n){return1<< n;}power(5);// 32

1的二进制是01,左移5位就是0100000,十进制就是2的5次方32。

有符号右移(>>)

有符号右移会将32位二进制数的所有位向右移动指定位数。如:

varnum=64;// 二进制1000000num=num>>5;// 二进制10,十进制2

求一个数的二分之一:

var num =64>> 1;//32

有符号左移与右移不会影响符号位。

无符号右移(>>>)

正数的无符号右移与有符号右移结果是一样的。负数的无符号右移会把符号位也一起移动,而且无符号右移会把负数的二进制码当成正数的二进制码:

varnum=-64;// 11111111111111111111111111000000num=num>>>5;// 134217726

所以,我们可以利用无符号右移来判断一个数的正负:

functionisPos(n){return(n === (n >>>0)) ?true:false;    }isPos(-1);// falseisPos(1);// true


~: 取反

 相当于:数字求负,在减1

1的 取 反----》结果是-2

一眼练习:

    //按位与&:两个操作数都是1,结果才是1

        alert(a&b) //结果是0

        //按位或:两个操作数只要有一个是1,结果就是1

        alert(a|b)  //结果是1

        //按位异或:两个数字一样,结果为0;两个数字不一样,结果就是1。

        alert(a^b)  //结果是1

        //简单的方法:数字求负,在减1

        alert(~a)//结果是-2


有符号左移(<<)

有符号左移会将32位二进制数的所有位向左移动指定位数。如:

varnum=2;// 二进制10num=num<<5;// 二进制1000000,十进制64

如果要求2的n次方,可以这样:

functionpower(n){return1<< n;}power(5);// 32

1的二进制是01,左移5位就是0100000,十进制就是2的5次方32。

有符号右移(>>)

有符号右移会将32位二进制数的所有位向右移动指定位数。如:

varnum=64;// 二进制1000000num=num>>5;// 二进制10,十进制2

求一个数的二分之一:

var num =64>> 1;//32

有符号左移与右移不会影响符号位。

无符号右移(>>>)

正数的无符号右移与有符号右移结果是一样的。负数的无符号右移会把符号位也一起移动,而且无符号右移会把负数的二进制码当成正数的二进制码:

varnum=-64;// 11111111111111111111111111000000num=num>>>5;// 134217726

所以,我们可以利用无符号右移来判断一个数的正负:

functionisPos(n){return(n === (n >>>0)) ?true:false;    }isPos(-1);// falseisPos(1);// true



JS常用的进制转换方法:

十进制转换为二进制:

语法

NumberObject.toString(radix);

其中,radix为可选。规定表示数字的基数,使 2 ~ 36 之间的整数。若省略该参数,则使用基数 10。但是要注意,如果该参数是 10 以外的其他值,则 ECMAScript 标准允许实现返回任意值。

toString()方法可把一个 Number 对象转换为一个字符串,并返回结果。



二进制转十进制:

parseInt(string, radix);

其中,string为必需。要被解析的字符串。radix为可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则parseInt() 将返回 NaN。

返回值

返回解析后的数字。

当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

举例,如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。


parseInt() 函数可解析一个字符串,并返回一个整数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容