61阅读

逻辑运算符-Java中的位移运算中的>>(逻辑右移)和>>>(算术右移)的区别?

发布时间:2017-10-08 所属栏目:专业学位和学术学位的区别

一 : Java中的位移运算中的>>(逻辑右移)和>>>(算术右移)的区别?

Java中的位移运算中的>>(逻辑右移)和>>>(算术右移)的区别?

Java中的位移运算中的>>(逻辑右移)和>>>(算术右移)的区别?的参考答案

逻辑右移是将各位依次右移指定位数,然后在左侧补0,

算术右移是将各位依次右移指(嫑犇)定位数,然后在左侧用原符号位补齐

二 : SQL中逻辑运算and or优先级

SQL中逻辑运算and or优先级

今天想写一个查询,实现“补加”数据的目的,执行的SQL如下:

www.2cto.com

Sql代码

select * from table_a where 1=1 and orgcode like '%111111%' or state like '%04%' and eventid like '%222222%'

备注说明:

1、like '%111111%' 能够查询所有数据

2、like '%04%' 能够查询一条数据

3、like '%222222%' 能够查询4条数据

我的目的是想根据like '%222222%'查询4条数据 + like '%04%'查询1条数据 = 5条数据;结果执行上面这个SQL查询出了所有的数据,

最后查找原因是——and的优先级比or的优先级高;上面的SQL实际等价于

Java代码

select * from table_a where 1=1 and orgcode like '%111111%' or (state like '%04%' and eventid like '%222222%')

如果想达到“筛选”的目的,可以如下改

Sql代码

select * from table_a where 1=1 and orgcode like '%111111%' and eventid like '%222222%' or state like '%04%'

关系型运算符优先级高到低为:not and or

备注:为了改变逻辑运算符的顺序,我们也可以使用()区分,它的优先级是最高的

扩展:逻辑运算符优先级 / java逻辑运算符优先级 / php逻辑运算符优先级

三 : 逻辑运算和移位指令

3.3.3 逻辑运算和移位指令 1.逻辑运算指令 1.逻辑运算指令
运算规则:按位操作,无进/ ● 运算规则:按位操作,无进/借位 对标志位的影响( NOT指令外 指令外) ● 对标志位的影响(除NOT指令外): CF OF SF ZF PF AF 0 0 * * * 无定义

根据运算结果设置

1

(1) 逻辑"与" AND 逻辑"
对两个操作数进行按位逻辑" 对两个操作数进行按位逻辑"与"操作. 操作. 格式: 格式:AND dest, src 用途:保留操作数的某几位,清零其他位. 用途:保留操作数的某几位,清零其他位. 中低4位 位清0. 例1:保留 中低 位,高4位清 . :保留AL中低 位清 AND AL, 0FH 例2:AL中有字符 ~'z', 将其转换成大写. : 中有字符'a'~ 将其转换成大写. 中有字符 AND AL, 01011111B
2

是否都是1. 例3:测试 的bit7,bit5,bit2是否都是 . :测试AL的 是否都是 AND AL, 10100100B CMP AL, 10100100B JZ YES ; if match, go to YES … … ; if not match … … YES: … … ; goes here if all '1'

3

(2) 逻辑"或" 逻辑" OR
对两个操作数进行按位逻辑" 对两个操作数进行按位逻辑"或"操作. 操作. 格式:OR dest, src 格式: 用途:对操作数的某几位置1; 用途:对操作数的某几位置 ;对两操作数 进行组合. 进行组合. 例1:把AL中的非压缩BCD码变成相应十进制 :把AL中的非压缩BCD码变成相应十进制 数的ASCII码. 数的ASCII码. OR AL, 30H
4

例2:把AH和AL中的非压缩BCD码组合成压 : AH和AL中的非压缩BCD码组合成压 缩的BCD码 放到AL中. 缩的BCD码, 放到AL中. MOV CL, 4 SHL AH, CL OR AL, AH 例3:把AL的第5位置为1 : OR AL, 00100000B

5

(3) 逻辑"非"(取反 NOT 逻辑" 取反) 取反
对操作数进行按位逻辑" 对操作数进行按位逻辑"非"操作. 操作. 格式: 格式:NOT mem/reg 例:NOT 例:NOT CX NOT BYTE PTR[DI]

6

(4) 逻辑"异或" XOR 逻辑"异或"
对两个操作数按位进行"异或" 对两个操作数按位进行"异或"操作. 格式:XOR 格式:XOR dest, src 用途:对reg清零(自身异或) 用途:对reg清零(自身异或) 把reg/mem的某几位变反(与'1'异或) reg/mem的某几位变反( 异或) 例1:把AX寄存器清零. 例2:把DH的bit4,3变反 :把AX寄存器清零. :把DH的bit4,3变反 ① MOV AX,0 XOR DH,18H ② XOR AX,AX ③ AND AX,0 ④ SUB AX,AX
7

(5) 测试指令 测试指令TEST
操作与AND指令类似,但不将" 操作与AND指令类似,但不将"与"的结果送回, 的结果送回, 只影响标志位. TEST指令常用于位测试, TEST指令常用于位测试,与条件转移指令一起 用. 例:测试AL的内容是否为负数. 例:测试AL的内容是否为负数. TEST AL,80H ;检查AL中D7=1? 检查AL中 =1? JNZ MINUS ;是1(负数),转MINUS 负数),转MINUS … … ;否则(正数)不转移 否则(正数)
MINUS: … … … …
8

2.移位指令 (1)非循环移位指令
算术左移指令 SAL(Shift Arithmetic 算术右移指令 SAR(Shift Arithmetic 逻辑左移指令 SHL(Shift Left) 逻辑右移指

令 SHR(Shift Right) 这4条指令的格式相同,以SAL为例: 条指令的格式相同, SAL为例: SAL
CL mem/reg, 1
Left) Right)

;移位位数大于1时 ;移位位数等于1时
9

移位指令执行的操作如下图所示: 移位指令执行的操作如下图所示:
最高位 CF (a)算术/逻辑左移 SAL/SHL 最高位 CF 最低位 CF 0 (b)算术右移 SAR (c)逻辑右移 SHR
10

最低位 0

最高位

最低位

非循环移位指令功能示意图

算术移位——把操作数看做有符号数; 算术移位——把操作数看做有符号数; 逻辑移位——把操作数看做无符号数. 逻辑移位——把操作数看做无符号数. 移位位数放在CL寄存器中,如果只移1 移位位数放在CL寄存器中,如果只移1位,也 可以直接写在指令中.例如: MOV CL,4 SHR AL,CL ;AL中的内容右移4位 AL中的内容右移4 影响C,P,S,Z,O标志. 影响C,P,S,Z,O标志. 结果未溢出时: 左移1 左移1位≡操作数*2 操作数* 右移1 右移1位≡操作数/2 操作数/
11

例:把AL中的数x 例:把AL中的数x乘10 因为10=8+2=2 因为10=8+2=23+21,所以可用移位实现乘10 ,所以可用移位实现乘10 操作.程序如下: SAL AL,1 ; 2x MOV AH,AL SAL AL,1 ; 4x SAL AL,1 ; 8x ADD AL,AH ; 8x+2x = 10x 10x

12

(2)循环移位指令 (2)循环移位指令
不含进位位的循环左移指令 ROL 不含进位位的循环右移指令 ROR 含进位位的循环左移指令 RCL 含进位位的循环右移指令 RCR 格式同非循环移位指令. 格式同非循环移位指令. 移位位数放在CL寄存器中,如果只移1 移位位数放在CL寄存器中,如果只移1位, 也可以直接写在指令中. 循环移位指令只影响标志位CF和OF. 循环移位指令只影响标志位CF和OF.
13

这4条指令的功能如下图示: 条指令的功能如下图示:
最高位 CF (a) ROL 最高位 CF (b) ROR 最低位 CF (d) RCR 最高位 最低位 CF (c) RCL 最低位 最高位 最低位

循环移位指令功能示意图
14

用移位操作代替乘除法可提高运算速度 例:前例中计算 x×10. 10. (1)采用乘法指令: (1)采用乘法指令:
MOV BL,10 MUL BL

共需70~77个 共需70~77个T周期. (2)采用移位和加法指令: (2)采用移位和加法指令:
SAL MOV SAL SAL ADD AL,1 AH,AL AL,1 AL,1 AL,AH ; ; ; ; ; 2T 2T 2T 2T 3T
15

只需1 只需11个T周期,仅相当于乘法的1/7. 周期,仅相当于乘法的1

循环移位举例:
例1:将AL的高4位与低4位互换. :将AL的高4位与低4 MOV CL,4 ROL AL,CL 例2:将1A00H内存单元中的双字循环左移1位. :将1A00H内存单元中的双字循环左移1 CMP [1A00H],8000H CMC RCL WORD PTR[1A02H],1 RCL WORD PTR[1A00H],1
16

例:设在1000H开始存有四个压缩的BCD码12, 例:设在1000H开始存有四个压缩的BCD码12, 34,56,78.要求把它们转换为ASCII码存放 34,56,78.要求把它们转换为ASCII码存放 在3000H开始的单元中. 3000H 12 1000H 34 假定DS,ES都已设置为 假定DS,ES都已设置为 56 78 数据段的

段基址. 程序见下页.
3000H
32H 31H 34H 33H 36H 35H 38H 37H

17

MOV SI,1000H MOV DI,3000H MOV BX,4 BBB: MOV AL,[SI] AND AL,0FH OR AL,30H STOSB LODSB MOV CL,4 SHR AL,CL OR AL,30H STOSB DEC BX JNZ BBB

;SI←BCD首址 SI←BCD首址 ;DI←ASCII首址 DI←ASCII首址 ;置计数器初值 ;AL←BCD码,第一次取12H AL←BCD码 第一次取12H ;屏蔽高4位→02H 屏蔽高4 ;转换为ASCII码→32H 转换为ASCII码 32H ;保存结果

;逻辑右移4位 逻辑右移4 ;得到高4位ASCII码 得到高4 ASCII码 ;保存结果 ;(BX)←(BX)-1 (BX)←(BX);(BX)≠0,则继续循环 (BX)≠0,则继续循环
18

作业
P152P152-P153 3.1, 3.2, 3.7, 3.9, 3.13 ,3.16 3.1, 3.2, 3.7, 3.9,

19

3.3.4 串操作指令
串:顺序放在内存中的一组相同类型的数据. 串操作:对串中的元素进行相同的操作. 串操作:对串中的元素进行相同的操作. 串操作的寻址方式: 源操作数指针———DS:SI(DS可超越) 源操作数指针———DS:SI(DS可超越) 目的操作数指针——ES:DI 目的操作数指针——ES:DI 每次串操作后: 每次串操作后: 串操作指令自动修改SI和DI——字节± ,字± 串操作指令自动修改SI和DI——字节±1,字±2. DF标志决定±.(注意:退出串操作后,指针指向最后 DF标志决定± 操作的元素的下一个元素) 操作的元素的下一个元素) 可完成两个存储单元之间的传送和比较操作(也仅 是串指令可以)
20

重复前缀
有的串操作指令前面可加上重复前缀 有的串操作指令前面可加上重复前缀REP.当 重复前缀REP. 使用REP前缀时,该指令重复执行,重复执行 使用REP前缀时,该指令重复执行,重复执行 次数由CX决定(带有REP前缀的串操作指令每 次数由CX决定(带有REP前缀的串操作指令每 执行一次,CX自动减1). 执行一次,CX自动减1

重复前缀包括: 重复前缀包括:
REP CX≠0 时重复执行 REPE/REPZ CX≠0∧ZF=1时重复执行 ∧ 时重复执行 REPNE/REPNZ CX≠0∧ZF=0时重复执行 ∧ 时重复执行

21

串指令使用的一般方法
设置源串地址 设置目标串地址 设置串长度 设置操作方向DF 设置操作方向 串指令

MOV SI, 源串首地址 源串) (或LEA SI, 源串) MOV DI, 目的串首地址 目的串) (或LEA DI, 目的串) MOV CX, 串长度 CLD(或STD) ( )

《串指令》 串指令》
22

⒈串传送指令MOVSB ⒈串传送指令MOVSB / MOVSW
指令执行的操作为: MOVSB: MOVSB: ((ES):(DI))←((DS):(SI)) SI±1, DI±1 SI± DI± MOVSW: MOVSW: ((ES):(DI+1)(DI))←((DS):(SI+1)(SI)) SI±2, DI±2 SI± DI± 指令也可写成:MOVS 指令也可写成:MOVS dest,src 但要求: ①src用DS:SI寻址,dest用ES:DI寻址 src用DS:SI寻址, est用ES:DI寻址 ②传送是字节还是字,由操作数的类型决定 传送是字节还是字,
23

串传送指令使用举例
用串传送指令实现200个字节的数据传 用串传送指令实现200个字节的数据传 送:
LEA SI,MEM1 SI, LEA DI,MEM2 DI, MOV CX,200

CX, CLD REP MOVSB HLT
24

⒉串比较指令CMPSB ⒉串比较指令CMPSB / CMPSW
指令执行的操作为:
CMPSB: ((DS):(SI))-((ES):(DI)) SI±1, DI±1 SI± DI± CMPSW: ((DS):(SI+1)(SI))-((ES):(DI+1)(DI)) SI±2, DI±2 SI± DI± 指令也可写成:CMPS 指令也可写成:CMPS dest, src 比较的结果只反映在标志位上,串本身无变化. 本指令可用来检查两个串是否相等.

25

⒊串扫描SCASB ⒊串扫描SCASB / SCASW
执行的操作: 对字节:(AL)-((ES):(DI)) DI±1 ± 对字: (AX)-((ES):(DI+1)(DI)) DI±2 ± 搜索指令执行的仍是比较(减法)操作,结果 只影响标志位. 要搜索的关键字放在AL(字节)或AX(字)中. 本指令用于在串中查找指定的信息.
26

SCAS指令加上重复前缀后,可对串进行连续 SCAS指令加上重复前缀后,可对串 扫描比较: 若前缀为REPZ,则表示比较结果相等且 (ZF=1)且串未结束(CX≠0),则继续比较. 若前缀为REPNZ,则表示比较结果不相等 (ZF=0)且串未结束(CX≠0)就继续比较.

27

例:在ES段的偏移1000H开始处存有10个 ASCII码.搜索'E',若找到则记下搜索次 数及存放地址,并在屏幕上显示'Y';若未 ES段 找到则显示'N'.(见右图)
在屏幕上显示一个字符的 指令段如下:(参见附录C.3) 指令段如下:(参见附录C.3) MOV DL,<字符> DL,<字符> MOV AH,2 INT 21H
1000H
41 42 43 44 45 46 ' A' 'B' 'C' ' D' 'E' ' F'

. . .

实现题目要求的程序段见下页:
28

MOV DI, 1000H MOV CX, 0AH MOV AL, 'E' CLD REPNZ SCASB JZ FOUND MOV DL, 'N' JMP DONE FOUND:DEC DI MOV ADDR, DI SUB DI, 1000H MOV NUM, DI MOV DL, 'Y' DONE: MOV AH, 2 INT 21H HLT

;(DI)←串偏移地址 串偏移地址 ;(CX)←串长度 串长度 搜索关键字='E' ;搜索关键字 ;从低地址到高地址进行搜索 若未找到, ;若未找到 继续搜索 找到, 转至FOUND ;找到 转至 串中无' , ;串中无'E',(DL)←'N' 转至DONE ;转至 ;指针回退 ;ADDR←'E'的地址 的地址 ;NUM←搜索次数 搜索次数 ;(DL)←'Y' ;显示字符
29

⒋串装入指令LODSB ⒋串装入指令LODSB / LODSW
执行的操作为: 对字节:( 对字节:(AL)←((DS):(SI)) SI±1 SI± 对字:( 对字:(AX)←((DS):(SI+1)(SI)) SI±2 SI± 串装入指令通常不加重复前缀. LODSB等价于: LODSB等价于: LODSW等价于: LODSW等价于: MOV AL,[SI] AL,[SI] MOV AX,[SI] INC SI INC SI INC SI
30

STRING1

38H 35H 36H 32H

'8' '5' '6' '2' 被 加 数

STRING2

39H 31H 36H 33H

...
'9' '1' '6' '3' 加 数 数 据 段

...
SUM 07H 07H 02H 06H 结 果
31

下面要求将和的结果送显示,为此, 下面要求将和的结果送显示,为此,要先 化成ASCII码再送显示, 化成ASCII码再送显示,程序段如下:
LEA SI,SUM+3 MOV CX,4 STD MOV AH,02 LP: LODSB ADD AL,30H MOV DL,AL INT 21H DEC CX JNZ LP …… ;(SI)←SUM+3 ;(CX)←和长度 和长度 减量修改SI ;置DF=1,减量修改 减量修改 ;(AH)←功能号 功能号 码至AL,且(SI)←(SI)-1 ;取BCD码至 码至 且 转换为ASCII码 ;转换为 码 ;(DL)←字

符 字符 ;显示字符

32

⒌串存储指令STOSB ⒌串存储指令STOSB / STOSW
指令的操作为: 对字节:((ES):(DI))←(AL) 对字节:((ES): DI±1 DI± 对字:((ES):(DI+1 对字:((ES):(DI+1)(DI))←(AX) DI±2 DI± 本指令用于把一块存储区域填充成某一初始



值(即对存储区进行初始化). 即对存储区进行初始化) 存储区域的首地址要预先设置到ES:DI中. 存储区域的首地址要预先设置到ES:DI中. 要存储到串中的数据要预先存到AL(AX)中. 要存储到串中的数据要预先存到AL(AX)中.
33

例1:把从A000H开始的2KB内存单元清零. :把从A000H开始的2KB内存单元清零. 程序段如下: MOV DI,0A000H DI,0 000H MOV AX,0 AX,0 MOV CX,1024 CX,1024 CLD REP STOSW

34

例2:把1000H开始的100个存储单元填入 ASCII码2AH(*). 程序段如下:
MOV DI, 1000H MOV AL, 2AH MOV CX, 100 CLD REP STOSB ; 首地址 ;'*' ;'*' ; 重复执行100次 重复执行100次 ; 增量修改DI 增量修改DI

35


本文标题:逻辑运算符-Java中的位移运算中的>>(逻辑右移)和>>>(算术右移)的区别?
本文地址: http://www.61k.com/1071512.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1