❶ javascript输入一个十进制数,将其转换成二进制数。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script>
function dec2bin(th){
dec = th.value;
bin = "";
while (dec > 0) {
if (dec%2 != 0) { bin = "1" + bin; }
else { bin = "0" + bin; }
dec = parseInt(dec/2);
}
document.getElementById('show').innerHTML = bin;
}
</script>
</head>
<body style=" text-align:center; margin-top:30px;">
<input name="" type="text" onkeyup="dec2bin(this)" value="" size="20" maxlength="20" />
<div>转换成二进制后的结果是:</div><div id="show"></div>
</body>
</html>
❷ js位运算符
之前对js的一些涉及到二进制的运算符一直似懂非懂,看到了就一脸懵逼,还得去控制台算一下。然后最近看算法的时候又看到了这个运算符,这里就简单介绍一下学习这些位运算符的过程。
注意: 以下运算均不涉及到小数。
先说这句话是什么意思。左移位是二进制的一种运算,就是在不改变二进制数值32位长度的前提下,将每位的数字都向左移动,左边移出去的直接丢弃,右边空出来的位置用0填充。无符号就是保持符号位不变,即本来是正数,移位后一样为正数。
这里以 7 << 2 为例。
首先将7转为二进制是 0000 0000 0000 0000 0000 0000 0000 0111 .
然后对其向左移两位.
得到值为 0000 0000 0000 0000 0000 0000 0001 1100 .
转换为十进制为 28.即 7 << 2 = 28 。
然后我们对以上的运算过程做一个处理,将这些二进制转换为我们熟悉的十进制。
对移位后的算式进行合并项可得到 2^4 + 2^3 + 2^2 = (2^2 + 2^1 + 2^0) * 2^2 ,即 2^4 + 2^3 + 2^2 = (2^2 + 2^1 + 2^0) * 2^2 = 7 * 2^2 。由此我们可得出 7 << 2 = 7 * 2^2 = 28 。
我们通过计算几个简单的左移位运算,与标准答案进行比较,验证一下这个结论。
在控制台中以上几个算式的结果为
答案完全一致。说明我们的结论是正确的。当然这个结论 仅限于那些二进制移位不会左移移出的数字的简单运算 。当我们遇到一些简单的可以口算的左移位运算时就可以使用这个结论快速得到结果,如果对于 99999 << 66 这种较复杂的运算你也用这个结论计算,也没有人会介意。
下面我们看一下负数的左移位运算。以 -66 << 2 为例。
首先,我们先复习一下负数如何转换为二进制。
负数转换为二进制的步骤有三:
然后对其向左移两位.
得到值为 1111 1111 1111 1111 1111 1110 1111 1000 .然后我们将其转换成十进制。
转换为十进制为 -264.即 -66 << 2 = -264 。
刚刚我们计算 -66 的二进制得到的是 1111 1111 1111 1111 1111 1111 1011 1110 。我们在控制台验证一下我们得到的这个二进制。
我们比较一下下面几个算式。
是的没错,进行无符号左移位运算时,当两个数的绝对值相等时,其相同位数的移位的绝对值一定相等。
这里以 666 >> 3 为例。
首先将666转换为二进制是 0000 0000 0000 0000 0000 0010 1001 1010 。
然后对其向右移三位。
得到值为 0000 0000 0000 0000 0000 0000 0101 0011 .
转换为十进制为 83.即 666 >> 3 = 83 。
然后我们对以上的运算过程做一个处理,将这些二进制转换为我们熟悉的十进制。
这个规律好像不太好总结?
这里以 -666 >> 3 为例。
因为是有符号的运算,所以这里不再适用上一小节说的js的特殊处理。先将-666转换为二进制。
即-666的二进制形式为 1111 1111 1111 1111 1111 1101 0110 0110 ,然后对其进行有符号右移位运算
移位后得到的值为 1111 1111 1111 1111 1111 1111 1010 1100 ,是一个负值,我们将其转成十进制。
我们对此结果进行验证。
可见,我们的运算是完全正确的。
这里我们以 666 >>> 3 为例。
首先将666转换为二进制是 0000 0000 0000 0000 0000 0010 1001 1010 。
然后对其向右移三位。
得到值为 0000 0000 0000 0000 0000 0000 0101 0011 .
转换为十进制为 83.即 666 >> 3 = 83 。
这里以 -666 >> 3 为例。
因为是有符号的运算,所以这里不再适用上一小节说的js的特殊处理。先将-666转换为二进制。
即-666的二进制形式为 1111 1111 1111 1111 1111 1101 0110 0110 ,然后对其进行有符号右移位运算
移位后得到的值为 0001 1111 1111 1111 1111 1111 1010 1100 ,转成十进制为536870828。
是不是超级大。因为是无符号右移位运算,所以在左边空出部分不论正负都会填充0.
我们对此结果进行验证。
可见,我们的运算是完全正确的。
注意:因为对负数进行无符号右移位运算时,所得结果很大,所以在使用过程中需要格外注意。
疑问:左移位和右移位根本都是只对位置进行了移动,那么对于 x1 >> k = y1 和 y2 << k = x2 中的 x1 等于 x2 , y1 等于 y2 吗?
不一定。因为我们不能确保移动过程中被丢弃的值均为0。但凡有一个1被丢弃,就不会相等。而如果被丢弃的都是0,那么 x1 === x2 y1 === y2 。如下图所示。
这里以 66 & 33 为例。
首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0010 0001 。
然后对其进行与运算。
得出结果为 0.
负数的与运算与正数并无区别,不做讨论。
这里以 66 | 66 为例。
首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0100 0010 。
然后对其进行与运算。
得出结果为 66.
负数的与运算与正数并无区别,不做讨论。
这里以 66 ^ 66 为例。
首先将两个数转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 和 0000 0000 0000 0000 0000 0000 0100 0010 。
然后对其进行与运算。
得出结果为 0.
负数的与运算与正数并无区别,不做讨论。
这里以 ~66 为例。
首先将其转换为二进制是 0000 0000 0000 0000 0000 0000 0100 0010 。
然后对其进行与运算。
将结果( 1111 1111 1111 1111 1111 1111 1011 1101 )转换为十进制
得出结果为 -67.
这里我们再我看几个例子。
从中我们可以看出, 位非操作就是对数字加一,然后取负 。我们可以写个简单的判断方法来验证。
位运算符运算结果非常有趣,在平时可以多加应用,但是一定要注意可能产生大数的预算,避免产生不必要的BUG。
这篇文章只是做了一个简单的介绍。后面有空了会做一下在实际开发中的应用,虽然我可能很久都遇不到。
JavaScript学习指南:JS入门教程
❸ js怎么将16进制字符串转换成相应的16进制数
主要有两个方法,其实都是对现有函数的使用:
方法1: sscanf()
函数名: sscanf
功 能: 从字符串格式化输入
用 法: int sscanf(char *string, char *format[,argument,...]);
以上的 format 为 %x 就是将字符串格式化为 16 进制数
例子:
#include <stdio.h>
void main()
{
char* p = "0x1a";
int nValude = 0;
sscanf(p, "%x", &nValude);
printf("%d\r\n", nValude);
}
输出:
26
方法2: strtol()
函数名: strtol
功 能: 将字符串转换为长整数
用 法: long strtol(char *str, char **endptr, int base);
上面的base就是我们要转换为几进制数
例子:
#include <stdio.h>
#include <stdlib.h>
void main()
{
char* p = "0x1b";
char* str;
long i = strtol(p, &str, 16);
printf("%d\r\n", i);
}
输出:
27
其实还有一种方法,就是用一个初始化为0~9~a~f的字符串数组,也就是一个十六进制对应表,用这个对应表即可算出一个十六进制字符串的数值,但这种发发太麻烦了,不推荐使用。
❹ 原码·反码·补码及JS中二进制转换
原码·反码·补码都是为了解决一个问题而诞生的: 如何用二进制表示复数。 并且他们间有着某种进化的关系。
知道原理后我们可以自己写函数将其转为补码
❺ 用JavaScript实现:输入任意的进制n和数字d,将其转换为10进制输出.
function test(n,d){
if(isNaN(n)){
return "n必须是数字!";
}
/*只考虑数字的情况.因为n可以是随便的数字.
如果说n=16那就16进制可以用上ABCDEF
那么如果输入100 你要用什么符号?
所有只考虑数字的情况.输入的必须是数字.省的麻烦.
还有小数之类的这里就不处理了*/
if(isNaN(d)){
return "d必须是数字!";
}
var src = (d + "").split("");
var res = 0;
for(i=0;i<src.length;i++){
if(src[i]>=n){
return d + "不是 "+n+" 进制数";
}
res += Math.pow(n,(src.length-1-i))*src[i];
}
return res;
}
alert(test(2,101));// 提示 5
alert(test(2,102));//提示 102 不是 2 进制数
❻ js 如何把ASCII字符转换为16进制数字
在chrome里,字符串有个charCodeAt()方法
例如"a".charCodeAt()为97,如果是"ba".charCodeAt()为98,默认第一位,即index为0;
"ba".charCodeAt(0)=98,而"ba".charCodeAt(1)为97
10进制内转16进制:
如17的16进制
(17).toString(16)
=
"11"
合起来就是("a".charCodeAt()).toString(16)
=
"61"
嫌麻烦容可以封装一个函数实现。
数字变字符:
String.fromCharCode(98)
=
"b"
❼ JS有没有将数字转成二进制的方法
将十进制抄转为二进制:
var a = 10;
var b = a.toString(2);
b即为10的二进制表示。但是注意b此时是字符串。
toString()默认参数为10,即把数字转换为十进制字符串,可接受2-36整数作为参数。
将二进制转为十进制:
var a = "10100110";
var b = a.parseInt(a, 2);
b即为a的十进制表示。
parseInt将字符串转换为数字,接受两个参数,第一个是要转换的字符串,第二个可省略,表示要解析的数字基数,可接受2-36整数作为参数。默认情况下会自动判断:若字符串以0x开头,则之后的字符以十六进制解析;以0开头,以八进制解析,0-9,以十进制解析。
❽ js实现16进制转换为Base64
新建文件 HexToBase64.js ,内容如下:
使用 import ... form ...
❾ js怎样把10进制数转换成16进制数显示
js把10进制转为16进制并显示:
定义一个转换函数:
var w=function(s){
document.write('<br>'+s)
};
转换方法:
w(parseInt(x,16));
比如传入15,打印出来的结果是:0xF。
❿ js 怎样将十六进制转成十进制
parseInt(数, 进制)
其中string为要转换的字符串,radix为二进制,八进制,十六进制或十进制。内
自己调试以容下。
不行的话你可以吧二进制转为十进制使用。并不影响你的而逻辑
同意yanzilisan183 的观点。