2.3 运算符
运算符分类
运算符分为算术运算符、逻辑运算符、关系运算符、移位运算符等。
类型 |
符号 |
功能说明 |
类型 |
符号 |
功能说明 |
---|---|---|---|---|---|
算术运算符 |
+ |
二进制加 |
关系运算符 |
> |
大于 |
位运算符 |
~ |
按位取反 |
缩位运算符 |
& |
缩位与 |
逻辑运算符 |
! |
逻辑非 |
移位运算符 |
>> |
右移 |
位拼接运算符 |
{,} |
将多个操作数 |
条件运算符 |
?: |
根据条件表达式 |
四值逻辑真伪判断
在逻辑运算符中,如果操作数是1位的,则用"1"表示逻辑真状态,用"0"表示逻辑假状态;
若操作数由多位组成,必须把操作数当做整体来处理,即如操作数所有位都是0,那么该操作数整体看做逻辑0,反之,只要其中一位为1,那么该操作数整体看做逻辑1;
如果任意一个操作数包含x,逻辑运算结果也为x。
!x // 结果为x 4'b1010 && 4'b1111 // 结果是1 4'b0000 && 4'b1001 // 结果是0
四值逻辑算术运算
整数除法将截断所有小数部分,只取整数部分。如7/4结果为1;
模运算符将求出与第一个操作数符号相同的余数;
7%4 // 结果为3 -7%4 // 结果为-3
如果算术运算符的操作数中出现x或z,那么整个算术运算符的运算结果为x。
4'b10x1 + 4'b0111 // 结果为不确定数 4'bxxxx
进行算术运算时,操作数的长度可能不一致,这时运算结果的长度由最长的操作数决定。但在赋值语句中,运算结果的长度由赋值目标长度决定。
四值逻辑关系运算
如果操作数的长度不同,那么长度短的操作数在高位添0补齐,如果操作数被比较位中出现x或z,那么结果为x。
4'b10x1 < 4'b1101 // 结果为x
四值逻辑比较
==
和!=
是把两个操作数的逻辑值做比较,由于操作数中某些位可能是x或z,所以比较结果也有可能是x。===
和!==
运算符是按位进行比较,即便在两个操作数中某些位出现了x或z,只要它们出现在相同的位,那么就认为两者是相同的,比较结果为1,反之为0,而不会出现结果为x的情况。其常用于case表达式的判别,所以又称为"case等式运算符"。
a = 4'b0010;
b = 4'bx10;
c = 4'bx101;
d = 4'bx10;
a === b // 结果为假,值为0,严格按位比较
a != d // 结果为x
b == d // 结果为x,因为操作数出现了x
b !== d // 结果为0
b === d // 结果为真,值为1,严格按位比较
位拼接运算符
作用是将两个或多个信号的某些位拼接起来成为一个新的操作数,进行运算操作
// 设A=1'b1, B=2'b10, C=2'b00,则: {B,C} // 结果为4'b1000 {A,B[1],C[0]} // 结果为3'b110 {A,B,C,3'b101} // 结果为8'b11000101
对同一个操作数的重复拼接还可以用双重大括号构成的运算符{{ }}
{4{A}} // 结果为4'b1111 {2{A},2{B},C} // 结果为8'b11101000
位运算符与缩位运算符的比较
假设:A=4'b1010,B=4'b1111
运算类型 |
~(取反) |
&(与) |
|(或) |
^(异或) |
~^(同或) |
---|---|---|---|---|---|
位运算 |
~A=4'b0101 |
A&B=4'b1010 |
A|B=4'b1111 |
A^B=4'b0101 |
A~^B=4'b1010 |
缩位运算 |
&A=1&0&1&0=0 |
~&A=1 |
|A=1 |
^A=0 |
~^A=1 |
条件运算符
三目运算符,运算时根据条件表达式的值选择表达式。一般用法:
condition_expr ? expr1 : expr2;
首先计算第一个操作数condition_expr
的值,如果结果为逻辑1,则选择第二个操作数expr1
的值作为结果返回;若结果为逻辑0,选择第三个操作数expr2
的值作为结果返回。
运算符的优先级
类型 |
符号 |
优先级 |
---|---|---|
取反 |
! ~ -(求2的补码) |
最高 |
算术 |
* / |
|
移位 |
>> << |
|
关系 |
< <= > >= |
|
等于 |
== != |
|
缩位 |
& ~& |
|
逻辑 |
&& |
|
条件 |
?: |
最低 |