zoukankan      html  css  js  c++  java
  • C#位运算基本概念与计算过程

    c#位运算系列

    前言

    一些非常基础的东西,在实际工作中没有用到、很少用到。一旦遇到,又不知所云。最近遇到一个问题,把一个int16(short) 、两个bool变量整合成一个int32(int),当听到这个要求时,我第一反应是不是需求弄错了,后来才发现是自己才疏学浅,这里就需要位运算相关的概念。
    这里补充一下这几个基本概念
    位、字节、字符(英文字母)、汉字、KB、MB、GB、TB的关系
    1.位:bit,也叫比特位,是计算机表示数据最小的单位,用二进制0和1来存储
    2.字节:byte,1byte(1B)=8b,一个字节=8位
    3.字符:char,1char=2byte=16b,1个字符=2个字节=16位
    4.KB,1KB=1024byte(1024B)
    5.MB,1MB=1014KB
    6.GB,1GB=1024MB
    7TB,1TB=1024GB
    一个汉字占两个字节,也就是16位,一篇1000字的文章,大概就是16*1000 个二进制的0或1 。
    一个10M的短视频,也就是10M=1024KB*10=1024字节*10*10=1024位*8*10*10
    大概就是919200个二进制的0和1了
    short 是16位,int是32位,long是64位

    1.什么是位运算

    在掌握位运算之前,应该清楚什么是位运算?什么样的数据类型可以进行位运算?云运算的结果是什么?
    1.位运算的对象是int 、char 类型,简而言之就是对二进制的1101(13)进行运算
    2.位运算的结果是整型

    符号 意义 运算对象类型 运算结果类型 示例
    ~ 逻辑非运算 整型、char 整型 ~a
    & 逻辑与运算 a&b
    | 逻辑或运算 a|b
    << 位左移运算 a<<2
    >> 位右移运算 a>>2
    ### 2.位逻辑与运算 **&**与运算是将两个运算对象按位于进行与运算。 规则是: 1&1=1 0&1=0 0&0=0 如图: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190427230449639.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tlYmkwMDc=,size_16,color_FFFFFF,t_70) 15的二进制是0000 1111 20的二进制是0001 0100 15&20的结果就是0000 0100 即结果是4

    3.位逻辑或运算

    在这里插入图片描述
    |位逻辑或运算是将两个运算对象按位进行或运算,运算的规则是
    1|1=1
    1|0=1
    0|0=0
    如15|20的结果计算结果就是31 即二进制0001 1111
    0000 1111(15的二进制) | 0001 0100(20的二进制)= 0001 1111结果是31

    4.位逻辑异或运算

    在这里插入图片描述
    ^ 位逻辑异或运算 是将两个运算对象按位进行异或运算,规则是:
    1异或1等于0
    1异或0等于1
    0异或0等于0
    即:相同得0,相异得1。
    0000 1111 ^ 0001 0100= 0001 1011结果是27

    5.位逻辑左移运算

    在这里插入图片描述
    位逻辑左移运算是将按位向左边移动若干位,左移后空出的部分为0
    比如15的二进制0000 1111 左移8位就是1111 0000 0000(15<<8)结果是3840
    左移3位(15<<3)就是0111 1000结果是120
    左移就是相当于乘,左移1位就是相当于乘以2的1次方,左移3位就是相当于乘以2的3次方,左移8位就是相当于乘以2的8次方
    a<<1 =a乘以2的1次方
    a<<2 =a乘以2的2次方
    a<<3 =a乘以2的3次方

    6.位逻辑右移运算

    在这里插入图片描述
    位逻辑右移运算是将按位向右边移动若干位,右移后空出的部分为0
    比如0000 1111(15)左移3位(15<<3)就是0000 0001(1)
    右移相当于整除,右移1位相当于除以2的1次方,右移2相当于除以2的2次方。
    a>>1 = a整除2的1次方
    a>>2 = a整除2的2次方
    a>>3 = a整除2的3次方

    7.位运算的作用

    如将一个月的签到记录保存到1个int类型中、权限设置、将4个short合并成一个long类型,16个bool类型合并成1个short。
    如这个问题所示
    需求:C# 用两个short,一个int32拼成一个long型
    要求:现在有两个short和一个int,需要拼成一个long型,高16位用short,中间32位用int,最低16位用另外一个short
    https://bbs.csdn.net/topics/392202825?page=1
    做法就是:
    ((long)shortA << 48 )+ ((long)intA << 16)+ shortB=longResult
    讲解:
    高16位的shortA先左移48,那么longResult 64位的最左边16位(高16位)就是shortA
    中间32位intA 就是先将intA左移16位,那么这个longResult的中间32位就是intA
    低16位就是最后剩下的16位用shortB。
    那么疑问来了可以通过longResult返推出shortA,shortB,intA。当然是不能这是直接相加。
    返回不应该用这种组合字符串的方式
    ((long)shortA << 48 ) 16位二进制0或1的字符串
    ((long)intA << 16) 32位二进制0或1的字符串
    shortB 16位二进制0或1的字符串
    将这三个字符串拼接成64位二进制字符串,再将这个64位二进制字符串转成一个long。

  • 相关阅读:
    Installing OpenSSH from the Settings UI on Windows Server 2019 or Windows 10 1809
    [CB]Intel 2018架构日详解:新CPU&新GPU齐公布 牙膏时代有望明年结束
    [百科]数字孪生
    wifi 标准
    WM_CONCAT和LISTAGG 语法例子
    Informix 启动 Fatal error in shared memory initialization解决方法
    B站日志系统的前世今生
    nginx安全日志分析脚本的编写
    可视化web日志分析工具Logstalgia
    CDH-5.7.0:基于Parcels方式离线安装配置
  • 原文地址:https://www.cnblogs.com/zhangmumu/p/10781201.html
Copyright © 2011-2022 走看看