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 | |||
>> | 位右移运算 | 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。
c#位运算基本概念与计算过程的更多相关文章
- C#位运算实际运用
前言 前几天写了一篇关于c#位操作,c#位运算基本概念与计算过程 最后提到一个实际问题 需求:C# 用两个short,一个int32拼成一个long型 要求:现在有两个short和一个int,需要拼成 ...
- C#位运算实际作用之操作整型某一位
1.前言 前几天写了两篇关于c#位运算的文章 c#位运算基本概念与计算过程 C#位运算实际运用 在文中也提到了位运算的实际作用之一就是合并整型,当时引用了一个问题: C# 用两个short,一个int ...
- javascript 位运算
位运算博大精深,本文总结下基本的位运算的概念. 1.整数的二进制码 位操作符用于在最基本的层次上,即按内存中表示数值的位来操作数值.ECMAScript中的所有数值都以IEEE-754 64位格式存储 ...
- Java I/O : Bit Operation 位运算
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- 我们必须要了解的Java位运算(不仅限于Java)
本文原创地址为 https://www.cnblogs.com/zh94/p/16195373.html 原创声明:作者:陈咬金. 博客地址:https://www.cnblogs.com/zh94/ ...
- Java位运算总结:位运算用途广泛《转》
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
- Java位运算总结:位运算用途广泛
前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...
- Python笔记_第一篇_面向过程_第一部分_3.进制、位运算、编码
通过对内存这一个部分的讲解,对编程会有一个相对深入的认识.数据结构是整个内存的一个重要内容,那么关于数据结构这方面的问题还需要对进制.位运算.编码这三个方面再进行阐述一下.前面说将的数据结构是从逻辑上 ...
- 利用位运算进行a+b的计算(Java&&Python)
题目链接 需要用到的位运算操作:异或(^).与(&).右移(<<) 异或运算:又称不进位加法,a^b得到的结果为a与b相加,但是需要进位的地方不进位得到的结果 与运算:找出来a和b ...
随机推荐
- Android的颜色值转换
Android的颜色int值比较变态,是个负值,用计算机术语讲叫补码,手工转换比较麻烦,首先看看文档 https://developer.android.com/reference/android/g ...
- pg_restore数据库恢复指令
pg_restore restores a PostgreSQL database from an archive created by pg_dump. Usage: pg_restore [OP ...
- DjangoRestFramework实践笔记
1.Restful服务的实现方式一共三种:function based view,class based view,viewset+router,这三种实现方式的封装重度依序升高,越往后越适合典型CU ...
- 基于Python的数据分析(3):文件和时间
在接下来的章节中,我会重点介绍一下我自己写的基于之前做python数据分析的打包接口文件common_lib,可以认为是专用于python的第三方支持库.common_lib目前包括文件操作.时间操作 ...
- SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)
SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...
- Python3实现ICMP远控后门(上)
这几天一直在研究远控木马的一些通信协议,比如TCP,UDP,ICMP,DNS,HTTP等等,对于TCP,UDP这两种就不讲解了,因为太常见了. 大家可能对采用ICMP,DNS的木马不是很熟悉,其实这两 ...
- The Beam Model:Stream & Tables翻译(上)
本文由 网易云发布. 作者:周思华 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 本文尝试描述Beam模型和Stream & Table理论间的关系(前者描述于数据流模型论文.the ...
- AVL Tree 操作
1.AVL树是带有平衡条件的二叉查找树, 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树. 2.AVL树的删除要比插入复杂.如果删除相对较少,那么用懒惰删除的方法是最好的策略. 3 ...
- 图片滚动(UP)的JS代码详解(offsetTop、scrollTop、offsetHeigh)【转】
源地址 信息技术教材配套的光盘里有一段设置图片滚动的JS代码,与网络上差不多,实现思路:一个设定高度并且隐藏超出它高度的内容的容器demo,里面放demo1和 demo2,demo1是滚动内容,dem ...
- Python_字符串格式化
#冒泡排序 array = [1,2,3,6,5,4] for i in range(len(array)): for j in range(i): if array[j] > array[j ...