位运算符的应用

发表于2020-07-22
评论0 5.1k浏览

运算符的基本概念和应用

位运算符的定义以及基本的使用可以参考:https://blog.csdn.net/Marccco/article/details/88709481

这边我坐下简要的总结:位运算符有&、|、^、!、~、>>、<<、>>>。

& 与运算符

1. 运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;

2. 应用:

① 清零;
② 取一个数中指定位。

| 或运算符

1. 运算规则:0|0=0;   0|1=1;   1|0=1;    1|1=1;

2. 应用:

常用来对一个数据的某些位置1。

^ 异或运算符

1. 运算规则:0^0=0;   0^1=1;   1^0=1;   1^1=0;

2. 应用:
① 使特定位翻转 找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可;
② 与0相异或,保留原值 ,X ^ 0000 0000 = 1010 1110。

~ 取反运算符

1. 运算规则:~1=0;   ~0=1;

2. 应用:

使一个数的最低位为零,可以表示为:a&~1。

<< 左移运算符

运算规则:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0),操作数每右移一位,相当于该数乘以2。例如: 二进制的 11111100左移移两位等于二进制的11110000。

>> 右移运算符

运算规则:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃,操作数每右移一位,相当于该数除以2。例如:二进制的11110010右移两位等于即二进制的 11111100。

>>> 无符号右移运算符

运算规则:右移后左边空出的位用零来填充。移出右边的位被丢弃。例如:二进制的11111111 11111111 11111111 11110010向右移两位后等于二进制的00111111 11111111 11111111 11111100。

案例

/// <summary>

/// 相机约束条件(设置冻结角度/位置)

/// </summary>

[Flags]

public enum CameraConstraints

{

   None = 1,

   FreezePositionX = 2,

   FreezePositionY = 4,

   FreezePositionZ = 8,

   FreezePosition = 16,

   FreezeRotationX = 32,

   FreezeRotationY = 64,

   FreezeRotationZ = 128,

   FreezeRotation = 256,

   FreezeAll = 512

}

 

int constraints = 0;

float px, py, pz = 0;

Vector3 resultLocalPos = Vector3.zero;

Vector3 resultLocalEulerAngle = Vector3.zero;

public int GetConstraints()

{

   return constraints;

}

public void SetConstraints(int constraints)

{

   this.constraints = constraints;

}

private Vector3 GetFreezePosition() {

   // 获取设备底层的位置信息

   var targetPos = hostSettings.GetPosition(objectName, channel);

   px = targetPos.x;

   py = targetPos.y;

   pz = targetPos.z;

   if ((constraints & (int)CameraConstraints.FreezePositionX) == (int)CameraConstraints.FreezePositionX)

   {

        px = 0;

    }

   if ((constraints & (int)CameraConstraints.FreezePositionY) == (int)CameraConstraints.FreezePositionY)

   {

       py = 0;

    }

   if ((constraints & (int)CameraConstraints.FreezePositionZ) == (int)CameraConstraints.FreezePositionZ)

   {

       pz = 0;

    }

   resultLocalPos.x = px;

   resultLocalPos.y = py;

   resultLocalPos.z = pz;

   return resultLocalPos;

}

外部调用SetConstraints接口设置,比如:(int)(CameraConstraints.FreezePositionX|CameraConstraints.FreezePositionY)。

  • 允许他人重新传播作品,但他人重新传播时必须在所使用作品的正文开头的显著位置,注明用户的姓名、来源及其采用的知识共享协议,并与该作品在磨坊上的原发地址建立链接
  • 可对作品重新编排、修改、节选或者以作品为基础进行创作和发布
  • 可将作品进行商业性使用

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: