c#位运算基本概念与计算过程

简介: c#位运算基本概念与计算过程前言一些非常基础的东西,在实际工作中没有用到、很少用到。一旦遇到,又不知所云。最近遇到一个问题,把一个int16(short) 、两个bool变量整合成一个int32(int),当听到这个要求时,我第一反应是不是需求弄错了,后来才发现是自己才疏学浅,这里就需要位运算相关的概念。

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
一个汉字占两个字节,也就是32位,一篇1000字的文章,大概就是321000 的二进制0或1 。
一个10M的短视频,也就是10M=1024KB10=1024字节1010=1024b1010*8
大概就是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
如图:
在这里插入图片描述
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。
原文地址https://www.cnblogs.com/zhangmumu/p/10781201.html

相关文章
|
1月前
|
算法 C#
23.c#计算敌人被玩家攻击的剩余血值
23.c#计算敌人被玩家攻击的剩余血值
16 0
|
4月前
|
C#
C# 对于“日期时间(DateTime)“的处理 时间差计算
C# 对于“日期时间(DateTime)“的处理 时间差计算
|
4月前
|
算法 数据可视化 C#
C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点
本文将介绍一种计算折线对应的平滑曲线坐标点的算法。该算法使用Chaikin曲线平滑处理的方法,通过控制张力因子和迭代次数来调整曲线的平滑程度和精度。通过对原始点集合进行切割和插值操作,得到平滑的曲线坐标点集合。实验结果表明,该算法能够有效地平滑折线,并且具有较高的精度和可控性。
53 0
C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点
|
8月前
|
传感器 机器人 数据处理
Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差(C#)
Baumer工业相机堡盟工业相机如何使用BGAPISDK的相机图像时间戳计算运行时间以及时间差(C#)
98 0
|
8月前
|
存储 数据采集 编解码
Baumer工业相机堡盟工业相机如何通过图像尺寸计算图像大小从而计算当前相机传输帧率(C#)
Baumer工业相机堡盟工业相机如何通过图像尺寸计算图像大小从而计算当前相机传输帧率(C#)
69 0
|
8月前
|
传感器 开发工具 C#
Baumer工业相机中偏振相机如何使用Baumer堡盟GAPI SDK来进行偏振数据的计算转换输出(C#)
Baumer工业相机中偏振相机如何使用Baumer堡盟GAPI SDK来进行偏振数据的计算转换输出(C#)
66 0
|
8月前
|
传感器 编解码 监控
Baumer工业相机堡盟工业相机如何通过BGAPISDK里的工具函数来计算工业相机的实时帧率(C#)
Baumer工业相机堡盟工业相机如何通过BGAPISDK里的工具函数来计算工业相机的实时帧率(C#)
39 0
|
9月前
|
C# C++
C++ C# Delphi 计算区域 合并 相交等
C++ C# Delphi 计算区域 合并 相交等
70 0
C#时间计算DateTime
C#时间计算DateTime
77 0
|
C# Windows
基于C#的ArcEngine二次开发30: visual studio没有为ToolsVersion14.0指定MSBuildToolsPath,指定的值的计算结果为空字符串
基于C#的ArcEngine二次开发30: visual studio没有为ToolsVersion14.0指定MSBuildToolsPath,指定的值的计算结果为空字符串
基于C#的ArcEngine二次开发30: visual studio没有为ToolsVersion14.0指定MSBuildToolsPath,指定的值的计算结果为空字符串