在了解GEE的Number数值类型的基础上,今天要学习一些特殊的运算符,比如左移运算符和右移运算符,以及编程语言中常见的按位运算。由于按位运算和遥感影像中的去云处理密切相关,因此今天将连带分享GEE中常见的去云处理的方法。
跟着小编,开始今天的学习吧!
一、学习目标
(1)理解左移和右移运算的原理
(2)理解“与”和“或”两种按位运算的原理
(3)掌握GEE中对遥感影像处理的方法
二、代码学习
(1)左移运算符和右移运算符
“<<”即箭头方向向左边为左移,“>>”即箭头方向右边为右移。两者为编程语言中比较特殊的运算符。理解该符号需要从二进制的角度:
现随机给出两个数a、b,其中a=3,b=4,现需求a<<b。
a的二进制表示方式:3 = 1*2^1+0*2^0
0 | 0 | 1 | 1 |
3<<4,表示的意思是3现有的二进制位数整体向左移4位:
0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
此时的结果为:result = 1*2^5+1*2^4+0*2^3+0*2^2+0*2^1+0*2^0 = (2+1)*2^4 = 48。从上述结果我们可以看出,左移的计算公式就是:
result = a*2^b
右移的理解以此类推,现随机给出两个数c、d,其中c=8,d=3,现需求c>>d。
c的二进制表示方式:8 = 1*2^3+0*2^2+0*2^1+0*2^0
1 | 0 | 0 | 0 |
8>>3,表示的意思是8现有的二进制位数整体向右移3位
0 | 0 | 0 | 1 |
此时的结果为:result = 1*2^0 = (1*2^3+0*2^2+0*2^1+0*2^0)/(2^3)。从上述结果我们可以看出,右移的计算公式就是:
result = a/(2^b)
//左移和右移运算符计算
var a = 3<<4;
print("Left Move",a);//left move
var b = 8>>3;
print("Right Move",b);//right move
(2)按位运算
按位运算,这里的位,不用多说,自然还是进制的概念。按位运算的实质就是将十进制的数字转化为二进制的数字,再进一步进行计算。二进制的数为0或1,两个数字常用于逻辑运算符的判断,通过二进制对应位置数的联合构建起四种运算,主要包括有与运算、或运算、异或运算和求反运算。在常规的数据处理过程中,与运算和或运算运用比较广泛,需要重点掌握。
A.与运算
与运算的计算规则为:两1才为1,有0便为0,即
1 and 1 = 1,1 and 0 = 0,0 and 1 = 0,0 and 0 = 0
现给定a、b两个数进行与运算,其中a = 2,b = 3。
0 | 0 | 1 | 0 |
0 | 0 | 1 | 1 |
按照从右至左的顺序依次比较,各位置对应的结果如下所示:
0 | 0 | 1 | 0 |
转化为十进制后得到的结果为2。
B.或运算
或运算的规则是:有1即为1,无1便为0,即
1 and 1 = 1,1 and 0 = 1,0 and 1 = 1,0 and 0 = 0
现给定a、b两个数进行与运算,其中a = 2,b = 3。
0 | 0 | 1 | 0 |
0 | 0 | 1 | 1 |
按照从右至左的顺序依次比较,各位置对应的结果如下所示:
0 | 0 | 1 | 1 |
转化为十进制后得到的结果为3。
C.取反运算
取反运算时,只有一个操作数。在讲解取反的规则之前,首先要理解补码的概念。补码是一种表示有符号整数的编码方式。在计算机中,可以使用补码来表示负数,以及进行加减运算。一般使用8位补码表示整数。计算机在存储二进制时,最高位分别用0和1区分正数和负数,补码的表示方式是将正数的二进制表示保持不变,负数的二进制表示取反后再加1。这样可以使得计算机在进行加减运算时,只需要使用同一套逻辑电路,简化了硬件设计。取反表示为0变1,1变0的过程。
似乎不好理解,我们举个例子来说明一下。
正数2的二进制表示为:
0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
对上述每一位二进制数进行取反为:
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
符号位变成1,说明取反运算后,结果变成负数,根据补码的定义,此时得到的结果为该负数的补码。
那么,该二进制表示的负数究竟是哪个十进制数字呢?
别急,我们先了解一下负数二进制的表示方法:
①原码表示:符号位定1,其余位为负数的绝对值的二进制。例如,要用原码表示-2:
1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
②反码表示:符号位定1,其余位在原码表示的基础上取反。例如,要用原码表示-2:
1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
③补码表示:符号位定1,其余位取反之后加1。例如,要用原码表示-2:
1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
了解完上述负数在电脑中的三种表示方式之后,为了求出二进制补码表示的原来的负数,是一个逆运算的过程。只需要在原来的基础上减1,并求反即可。
先对求反之后的结果减1得到:
1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
再取反:
1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
此时得出:
result = -( 1*2^1+1*2^0) = - 3
上述推导过程有点绕,希望各位读者能够结合实例按照过程自行推到一遍。
D.异或运算
异或运算,也称为“异或操作”或“X操作”,是一种逻辑运算符。它的作用是对两个操作数进行比较,如果两个操作数的对应位不同,则结果1,否则结果为0。说大白话就是:相等就是0,不等就是1。
1 and 1 = 0,1 and 0 = 1,0 and 1 = 1,0 and 0= 0
现给定a、b两个数进行与运算,其中a = 2,b = 3。
0 | 0 | 1 | 0 |
0 | 0 | 1 | 1 |
按照从右至左的顺序依次比较,各位置对应的结果如下所示:
0 | 0 | 0 | 1 |
转化为十进制后得到的结果为1。
var c = ee.Number(2);
var d = ee.Number(3);
var e1 = c.bitwiseAnd(d);
var e2 = c.bitwiseOr(d);
var e3 = c.bitwiseNot();
var e4 = c.bitwiseXor(d);
print("a bitwiseAnd b:",e1,"a bitwiseOr b:",e2);
print("a bitwiseNot b:",e3,"a bitwiseXor b:",e4);
今天主要带大家回顾了二进制的相关知识,涉及的代码很简单,但是原理有点绕,希望对大家了解相关的逻辑有帮助,注意啦,今天的按位运算和遥感影像中非常重要的去云处理有密切关系,明天将对遥感影像的去云处理进行分享。
如果今天的分享对你有帮助,不要忘记给小编点赞哦,你的鼓励是小编持续创作的动力!更多精彩内容,欢迎关注小编的微信公众号“梧桐凉月”,谢谢大家!