位运算计算方式与实例

位运算符

1.非 ~
是一个单目运算符,只有一个运算对象。0变成1,1变成0。例如:二进制1000 1101 进行位逻辑非运算为:0111 0010,对应十进制~141等于-142。
正数取反(对应的负数-1),负数取反(对应的正数-1)。例如:~14 =-15    ~(-14)=13

2.与&
将两个对象按位与运算,1与1等于1,1与0等于0, 0与0等于0
比如二进制:1000 1101 & 0110 1100 等于00001100 对应十进制:141&108 =12

3.或 |
将两个对象按位或运算,1或0等于1,1或1等于1,0或0等于0
例如二进制: 1000 1101 | 0110 1100 等于11101101 对应十进制:141|108=237

4.异或^
将两个对象异或运算,规则: 相同得0,不同得1
例如二进制: 1000 1101 ^ 0110 1100 等于1110 0001 对应十进制:141^108=225

5.左移<<
将整个数 按位左移 若干位,空位补0
例如:1000 1101<<3 等于0100 0110 1000 对应十进制 :141<<3 =1128
这里要说明一下:当溢出位不为0时,此时要考虑32位。
再如:0011 0110<<2 ,此时溢出位为0,所以就等于 1101 1000 ,对应十进制:54<<2=216
54<<3 = 0001 1011 0000 对应十进制:432
负数的左移运算,可以先求对应正数,加上-

6.右移>>
位右移运算将整个数按位右移若干位,右移后空出的部分填0
例如:1000 1101>>3 等于0001 0001 对应十进制 :141>>3 =17
负数右移:先求对应正数右移,取负减1: -141>>3= -18

进制

二进制:0和1组成,二进制数运算规律是逢二进一
十进制:0-10组成 ,满十进一,满二十进二,

进制转换

  1. 十进制转换二进制怎么快速计算?
    不断除以2,将所得余数逆向就是所得的二进制数
    例如:
    以计算8的二进制为例:
    8/2=4 余0
    4/2=2 余0
    2/2=1 余0
    1/2=0 余1
    那么8的二进制数就是1000,同理,16的就是10000.47的就是101111
     
  2. 二进制数如何转换成十进制数?
    就是是第几位就乘以2的几次方 从右往左数,得到的结果相加就是答案
    例如:01101011.转十进制:
    1乘2的0次方=1
    1乘2的1次方=2
    0乘2的2次方=0
    1乘2的3次方=8
    0乘2的4次方=0
    1乘2的5次方=32
    1乘2的6次方=64
    0乘2的7次方=0
    然后:1+2+0+8+0+32+64+0=107.
    二进制01101011=十进制107
    快速:1是0000 0001,2是0000 0010, 4是0000 0100 以此类推 8 16 32...

位移计算方法:

概念:
[原码]:计算机中将一个数字转换为二进制,并在其最高位加上符号的一种表示方法。(规定)
[反码]:根据表示规定,正数的反码就是本身,而负数的反码,除符号位外,其余位依次取反。
[补码]:根据表示规定,正数的补码就是本身,而负数的补码,是在其反码的末位加1。(为了溢位)

规则:
(第一位是不是符号位看是不是unsigned,不是unsigned约定第一位是符号位)
不带符号:
左移补0 ,右移不足看符号位补。
带符号运算:
负数,原码→反码(取反),算补码(+1),计算,然后反码→补码,得到结果。

例子:
计算正数: 
例如: 1 << 0 就是把1(00000001)左移0位,所以不变还是1 ,
例如: 1 << 1 就是把1(00000001)左移1位,结果是2(00000010),

计算负数:
例如:-7 >> 2;     -7→原码1000 0111→反码1111 1000→ 补码1111 1001→右移2→1111 1110→ 反码1111 1101→ 补码1000 0010 就是-2
例如:-5 >> 1;    -5→原码1000 0101→反码1111 1010→ 补码1111 1011→右移1→1111 1101→ 反码1000 0010→ 补码1000 0011 就是-3
例如:-10 >> 2;-10→原码1000 1010→反码1111 0101→ 补码1111 0110→右移2→1111 1101→ 反码1000 0010→ 补码1000 0011 就是-3

例如:-2 & -3;       
//原码 10000010 10000011
//取反 11111101 11111100 (反码)
//加一 11111110 11111101 (补码)
//与运算 11111100
//取反:10000011
//再加1:10000100 是-4

字节转换

1字节是8位(bit) 
美国出了一个编码标准,名字叫ASCII编码(全称American Standard Code for information Interchange 美国信息交换标准码),它把所有字符包括单词,标点符号全部都囊括进来了,总共是128(0~127)个字符,这足够美国人用了,而2^7=128,即7个0和1的组合,同时为了保险,万一不够用呢,就将8个0和1的组合存储在一个字节中,这就是1个字节(1B)用8个二进制位(8b)表示的由来

---使用实例---

---@type int
local banFlag = 0

---@class ActiveType
ActiveType =
{
    a = 1 << 0,
    b = 1 << 1,
    c = 1 << 2,
    d = 1 << 3,
}

---@param isActive boolean
---@param type
function SetSlotActive(isActive, type)
    if isActive then
        local mask = ~ type
        banFlag = banFlag & mask
    else
        banFlag = banFlag | type
    end
end

在C#中,你可以使用位运算符来获取一个数字的二进制数值的特定位。下面是一个示例,用于获取一个整数的二进制表示中的第一位和第二位的数值:

int num = 5; // 二进制表示为 101 
int firstBit = (num >> 0) & 1; // 获取第一位 
int secondBit = (num >> 1) & 1; // 获取第二位 

在这个示例中,我们首先将数字右移了0位(实际上没有移动)然后与1进行了与操作,以得到第一位的数值。然后,我们将数字右移了1位,再与1进行了与操作,以得到第二位的数值。 注意,这里的位数是从0开始计数的,也就是说第一位实际上是最右边的一位,第二位是从右边数起的第二位,以此类推。

------

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值