正经学C#_位移与其位移运算符[c#入门经典]
在c#入门经典一书中,最为糟糕的一节就是位移了,完全没有讲明白,也没有说全,似乎只是轻轻点了一下何为位移,带了两次原码和补码,完全不理会是否明白不明白。这一点这本书很差。因为此书说了,在大多数应用开发中,除了数学应用,这个功能不是很好常用。
位移,是对操作数的二进制进行操作,计算中,二进制是以补码方式计算
何为 原码,补码。
原码:数字的二进制
补码,计算机系统中数值的存储方式,二进制的特殊计算方式,也就是正数的负数形式,负数均已补码形式存储。计算过程:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外,末尾+1,按照二进制计算方式计算
反码:计算机系统中数值的存储方式,二进制的特殊计算方式。计算过程:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
原码和补码,反码是存在关系的,三者之间是可以互相转换。
原码变补码,原码变反码
正数:正数的原码和补码,反码是一样。
9的二进制:1001 原码0000 1001 补码0000 1001,反码0000 1001
负数 :
原码:就是二进制,最高位位1。
补码:过程最高位1表示符号,其他位按位取反,1变成0,0变成1。最后整个数加1.
反码:除了最高位表述符号,1位负数【-】,0为正数【+】,之外每一位按位取反,1变成0,0变成1
-9 原码0000 1001(上面说过,负数的二进制,均已正数的二进制的补码出现,-9的正数也就是9,二进制原码也就是9的二进制),补码1111 0111, 反码1111 0110
补码的过程:先是最高位表示符号【1是负数,0是正数】,其他位按位取反,1变成0,0变成1也就是: 1111 0110,之后整个数字+1,
1111 0110+1=1111 0111就ok了
反码的过程:先是最高位表示符号【1是负数,0是正数】,其他位按位取反,1变成0,0变成1也就是: 1111 0110 也就ok了,【补码和反码之间的关系是,反码的末尾+1】
补码,反码求原码
正数:
正数的原码,补码,反码是一样的,一样的!
2:原码0000 0010,反码:0000 0010,补码0000 0010
负数:
补码求原码:除了最高位表示符号不变之外,其他位按位取反,1变0,0变1,最后+1【按二进制计算方法计算】
反码求原码:除了最高位表示符号不变之外,其他位按位取反
-2 补码 1111 1110 反码1111 1101 原码0000 0010【正数的2,因为计算机的负数均已正数的二进制的补码形式存储或者变现,负数的原码也即是此负数的去符号的数】
ok了,搞明白什么是原码,补码,反码,咱就看看 位移运算符
下表列出了 C# 支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:
运算符 | 名字 | 描述 | 实例 |
---|---|---|---|
& | 位逻辑与运算 | 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 | (A & B) 将得到 12,即为 0000 1100 |
| | 位逻辑或运算 | 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 | (A | B) 将得到 61,即为 0011 1101 |
^ | 位逻辑异或运算 | 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 | (A ^ B) 将得到 49,即为 0011 0001 |
~ | 位逻辑非运算 | 二进制补码运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0。 | (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
<< | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 | A << 2 将得到 240,即为 1111 0000 | |
>> | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 | A >> 2 将得到 15,即为 0000 1111 | |
<<= | 左移且赋值运算符 | A <<= 2 等同于 A = A << 2 | |
>>= | 右移且赋值运算符 | A >>= 2 等同于 A = A >> 2 | |
&= | 按位与且赋值运算符 | A &= 2 等同于 A= A & 2 | |
^= | 按位异或且赋值运算符 | A ^= 2 等同于 A = A ^ 2 | |
|= | 按位或且赋值运算符 | A |= 2 等同于 A = A | 2 |
解释一下较为理解苦难的地方
A | B | A& B | A | B | A ^ B |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
运算符 | 结果 | |
<< | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 | A << 2 将得到 40,即为 0010 1000 |
>> | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 | A >> 2 将得到 2,即为 0000 0010 |
位移,是对操作数的二进制进行操作,计算中,二进制是以补码方式计算
左移运算符:<< 格式 X<<N, X的类型只能是int,uint、long或ulong,N的类型只能是int,N的类型只能是int,或者显示转换为这些类型之一,否则变异程序时会出现错误。
列子:
20 二进制 0000 0000 0000 0000 0000 0000 0001 0100【操作类型默认为int ,int是32位,所以二进制也是32】
20<<3 也就是 0000 0000 0000 0000 0000 0000 1010 0000 ,十进制等于160
-10二进制 1111 1111 1111 1111 1111 1111 1111 0110【负数均已正数的补码形式存储或者表示】
-10 <<5 : 1111 1111 1111 1111 1111 1110 1100 0000 转换成十进制 -320
也就是右移运算符:>> 格式X>>N, X的类型只能是int,uint、long或ulong,N的类型只能是int,N的类型只能是int,或者显示转换为这些类型之一,否则变异程序时会出现错误。
列子:
正数
54 二进制:0000 0000 0000 0000 0000 0000 0011 0110
54>>4 0000 0000 0000 0000 0000 0000 0000 0011 十进制 3
负数
-24 补码 1111 1111 1111 1111 1111 1111 1110 1000
-24>>2 1111 1111 1111 1111 1111 1111 1111 1010 十进制-6
ok
正经学C#_位移与其位移运算符[c#入门经典]的更多相关文章
- 正经学C#_判断[switch语句]:[c#入门经典]
switch是一个和IF语句极其相似的语句.但是Switch允许条件可以有多个值. 程序的基本结构如下 switch(textVal) { case Val: 程序代码 break case Val2 ...
- 正经学C#_判断[IF语句]:[c#入门经典]
判断语句几乎是最为常用的语句之一,是最有效的. 先说IF语句,IF语句也是属于分支的一种,用来控制流程的. IF的语句是这样的 IF(xxx 条件) { //代码块 } ,b; ) { b=a--; ...
- 正经学C#_布尔运算[布尔值与其布尔运算符]:《c#入门经典》
前面几个章节简述了 C#中得常用得算术运算符.这一章节说布尔值与其布尔运算符. 布尔值在c#中表示方式是 bool类型,这个类型可以储存两个值,true或者false,或者真或者假,可以说0或者1. ...
- 正经学C#_表达式与其运算符[算术运算符]:《c#入门经典》
表达式:正如字面意义,它是通过算术运算符来进行运算的数学公式.表达式的意义我们都是很明白的,大白话就是一个公式嘛.不是很难懂. 表达式不是一个单独的存在,必然有操作数或者操作符的.在c#中有操作符有很 ...
- 正经学C#_运算符优先级:[c#入门经典]
学了那么多的运算符,终于差不多结束了,现在要说一下 总体的优先级别 高到低的顺序 类别 运算符 结合性 前缀 ++,--,(),+,-,!,~ 从左到右 乘除 * / % 从左到右 加 ...
- 正经学C#_表达式与其运算符[赋值运算符]:《c#入门经典》
上一节中介绍了算术运算符,算术运算符的优先级. 今天说说赋值运算符,不陌生,=[等号]就是赋值运算符的一种. 除此之外还有好多种的.见下图. 运算符 类别 描述 实例 = 二元 简单的赋值运算符,把右 ...
- 正经学C#_介绍与其编写基础:《c#入门经典》
本文所讲内容,均可在<c#入门经典>中可以查询.如有错误,敬请指出.谢谢! C#:全称C Shar.是微软.Net Framework平台下最为主要的客户语言之一.个人理解,c#是微软最为 ...
- 正经学C#_变量与其转换:《c#入门经典》
上一节上了变量.末尾简单了说了下 命名方式,声明变量. 命名方式在C#,或者任何语言都是非常重要的一门学问.值得去深入思考一下.变量名的优化与其工作效率的提升,有很多大的关系的. 声明变量,上节介绍了 ...
- 正经学C#_委托
以前不会,甚至连想去学都没想.啧啧啧,我是何等朽木啊. 我先不说其中理念,或者原理,咱就先说最简单的用法.怎么去使用委托. 委托 Delegate 使用委托,就要先定义一个委托.定义一个委托就要先声明 ...
随机推荐
- 利用PowerDesigner设计数据库
PowerDesigner非常强大, 可以利用它完成数据库的设计. 1.下载地址:http://pan.baidu.com/s/1DsLrg 2.表设计: 建立概念数据模型(Conceptual Da ...
- MYSQL BENCHMARK()函数
MySQL有一个内置的BENCHMARK()函数,可以测试某些特定操作的执行速度. BENCHMARK(count,expr) BENCHMARK会重复计算expr表达式count次,通过这种方式就可 ...
- Redis codis 搭建测试
codis Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别,有部分命令支持 Codis ...
- appium_python 实现手势密码
直接上代码吧: from appium.webdriver.common.touch_action import TouchAction from driver import AppiumTest # ...
- 简单的触发黑名单阻断演示 control+c
#include "stdafx.h"#include <signal.h>#include <windows.h> #include <iostre ...
- JavaScript组合模式---引入
首先:使用一个例子来引入组合模式,需求为(1)有一个学校有2个班(一班,二班)(2)每个班级分2个小组(一班一组,一班二组,二班一组,二班二组)(3)学校计算机教室有限,每一个小组分着来上课 然后:根 ...
- mysql权限表
http://blog.csdn.net/zhangliangzi/article/details/51882710
- Python之路:面向对象及相关
其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass obj = Foo() isinstan ...
- Linux reboot后数据库无法自动启动
需将以下由N改为Y orcl:/data/oracle_db/product/13.2.0/db_1:Y Last login: Thu Aug 27 16:36:19 2015 from 10.10 ...
- 前端学习笔记2017.6.21-html是个什么东西
html有两种意思,html语言和html格式 html语言是一种面向人类的计算机语言,这是啥意思?人类用html这种语言描述出一个网页的样子,浏览器解析这个语言并展示出来. html格式是一种文件格 ...