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 ...
随机推荐
- Sina微博爬取@pyspider
这是一篇不应该写的文章,都写了,针对特定“方式”的爬虫也就没法爬了. 1.模拟登录的一些文章: 解析新浪微博的登录过程(2013-12-23): http://www.cnblogs.com/houk ...
- MVC-AOP(面向切面编程)思想-Filter之IExceptionFilter-异常处理
HandleErrorAttribute MVC中的基本异常分类: Action异常 T view异常 T, service异常 T, 控制器异常 F(异常get不到), ...
- Search in rotated array two
description: Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed ...
- C++单例
template<class T> class Singleton { public: using object_type = T; struct object_creator { obj ...
- sql语句联表更新(从一个数据库中的一张表更新到另一个数据库的另一张表)
一.sql server数据库写法: update a set a.ksgmm=b.ksgmm,a.ksgm=b.ksgm,a.scztm=b.scztm,a.sczt=b.sczt from lan ...
- leetCode刷题(找到两个数组拼接后的中间数)
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- ArcCore重构-头文件引用问题的初步解决
基于官方arc-stable-9c57d86f66be,AUTOSAR版本3.1.5 基本问题 1. 头文件引用混乱,所有头文件通过从搜索路径(-I)中引用,存在名称污染问题,需加入路径信息: ...
- 非正则表达式检验邮箱格式是否合法(Java代码实现)
一.邮箱格式需满足以下要求 1. 有且只有一个@ 2. @不能放在开头,也不能放在结尾 3. @之后必须有. ...
- [已解决]pycharm的debugger模式不显示调试结果?
由于朋友遇到这个问题,特意上网搜索了很久,没有相关答案,后来自己尝试与能正常显示的做设置对比,才找到控制开关,在此做个记录,分享给遇到这个问题的朋友. 问题如下图: 解决办法: 左上角File--&g ...
- JavaScrip对象
一.JavaScript对象概述 JavaScript 中的所有事物都是对象:字符串.数值.数组.函数...此外,JavaScript 允许自定义对象.JavaScript 提供多个内建对象,比如 S ...