在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
1、位逻辑与运算
位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0,0与0等于0。
比如:1001 0001(二进制)&1111 0000等于1001 0000(二进制)。
 
2位逻辑或运算
位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,
0或0等于0。比如1001 0001(二进制)| 1111 0000(二进制)等于1111 0001(二进制)。
 
3、位逻辑异或运算
位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:1异或1等于0,
1异或0等于1,0异或0等于0。即:相同得0,相异得1。
比如:1001 0001(二进制)^1111 0000(二进制)等于0110 0001(二进制)。
 
4、位逻辑非运算
位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0。
比如,对二进制的1001 0001进行位逻辑非运算,结果等于0110 1110,用十进制表示就是:
~145等于110;对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。
 
剩下就是 左移 右移 【<<】【>>】
 
                           A=10 二进制:0000 1010 
运算符   结果
<< 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 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#入门经典]的更多相关文章

  1. 正经学C#_判断[switch语句]:[c#入门经典]

    switch是一个和IF语句极其相似的语句.但是Switch允许条件可以有多个值. 程序的基本结构如下 switch(textVal) { case Val: 程序代码 break case Val2 ...

  2. 正经学C#_判断[IF语句]:[c#入门经典]

    判断语句几乎是最为常用的语句之一,是最有效的. 先说IF语句,IF语句也是属于分支的一种,用来控制流程的. IF的语句是这样的 IF(xxx 条件) { //代码块 } ,b; ) { b=a--; ...

  3. 正经学C#_布尔运算[布尔值与其布尔运算符]:《c#入门经典》

    前面几个章节简述了 C#中得常用得算术运算符.这一章节说布尔值与其布尔运算符. 布尔值在c#中表示方式是 bool类型,这个类型可以储存两个值,true或者false,或者真或者假,可以说0或者1. ...

  4. 正经学C#_表达式与其运算符[算术运算符]:《c#入门经典》

    表达式:正如字面意义,它是通过算术运算符来进行运算的数学公式.表达式的意义我们都是很明白的,大白话就是一个公式嘛.不是很难懂. 表达式不是一个单独的存在,必然有操作数或者操作符的.在c#中有操作符有很 ...

  5. 正经学C#_运算符优先级:[c#入门经典]

    学了那么多的运算符,终于差不多结束了,现在要说一下  总体的优先级别 高到低的顺序 类别  运算符  结合性  前缀 ++,--,(),+,-,!,~ 从左到右  乘除  * / %  从左到右  加 ...

  6. 正经学C#_表达式与其运算符[赋值运算符]:《c#入门经典》

    上一节中介绍了算术运算符,算术运算符的优先级. 今天说说赋值运算符,不陌生,=[等号]就是赋值运算符的一种. 除此之外还有好多种的.见下图. 运算符 类别 描述 实例 = 二元 简单的赋值运算符,把右 ...

  7. 正经学C#_介绍与其编写基础:《c#入门经典》

    本文所讲内容,均可在<c#入门经典>中可以查询.如有错误,敬请指出.谢谢! C#:全称C Shar.是微软.Net Framework平台下最为主要的客户语言之一.个人理解,c#是微软最为 ...

  8. 正经学C#_变量与其转换:《c#入门经典》

    上一节上了变量.末尾简单了说了下 命名方式,声明变量. 命名方式在C#,或者任何语言都是非常重要的一门学问.值得去深入思考一下.变量名的优化与其工作效率的提升,有很多大的关系的. 声明变量,上节介绍了 ...

  9. 正经学C#_委托

    以前不会,甚至连想去学都没想.啧啧啧,我是何等朽木啊. 我先不说其中理念,或者原理,咱就先说最简单的用法.怎么去使用委托. 委托 Delegate 使用委托,就要先定义一个委托.定义一个委托就要先声明 ...

随机推荐

  1. 利用PowerDesigner设计数据库

    PowerDesigner非常强大, 可以利用它完成数据库的设计. 1.下载地址:http://pan.baidu.com/s/1DsLrg 2.表设计: 建立概念数据模型(Conceptual Da ...

  2. MYSQL BENCHMARK()函数

    MySQL有一个内置的BENCHMARK()函数,可以测试某些特定操作的执行速度. BENCHMARK(count,expr) BENCHMARK会重复计算expr表达式count次,通过这种方式就可 ...

  3. Redis codis 搭建测试

    codis Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别,有部分命令支持 Codis ...

  4. appium_python 实现手势密码

    直接上代码吧: from appium.webdriver.common.touch_action import TouchAction from driver import AppiumTest # ...

  5. 简单的触发黑名单阻断演示 control+c

    #include "stdafx.h"#include <signal.h>#include <windows.h> #include <iostre ...

  6. JavaScript组合模式---引入

    首先:使用一个例子来引入组合模式,需求为(1)有一个学校有2个班(一班,二班)(2)每个班级分2个小组(一班一组,一班二组,二班一组,二班二组)(3)学校计算机教室有限,每一个小组分着来上课 然后:根 ...

  7. mysql权限表

    http://blog.csdn.net/zhangliangzi/article/details/51882710

  8. Python之路:面向对象及相关

    其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object):     pass   obj = Foo()   isinstan ...

  9. 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 ...

  10. 前端学习笔记2017.6.21-html是个什么东西

    html有两种意思,html语言和html格式 html语言是一种面向人类的计算机语言,这是啥意思?人类用html这种语言描述出一个网页的样子,浏览器解析这个语言并展示出来. html格式是一种文件格 ...