在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. vs2013-zlib1.2.8编译使用

    1.编译步骤 a.先用vs2013命令行执行下bld_ml32.bat批处理 b.将inffas32.obj和match686.obj复制到目录zlib128\zlib-1.2.8 c.打开zlib- ...

  2. codeforce 510C Fox And Names(拓扑排序)

    Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  3. Java学习之系统高可用性渲染接口日志自动服务降级

    背景:公司都追求系统的高可用性,这里不可用时间就是其中很重要的一个指标,为此在做系统功能升级迭代的过程中如何快速处理异常恢复正常功能极为重要.现在对新增模块的要求是都增加开关,方便快速关闭异常模块,但 ...

  4. 【277】◀▶ Python 列表/元组/字典说明

    目录: 前言 一.访问列表中的值 二.更新列表 三.删除列表元素 四.Python 列表脚本操作符 五.Python 列表函数 & 方法 参考:Python 列表(List)使用说明 列表截取 ...

  5. Android中同一个ImageView中根据状态显示不同图片

    一般: if(条件1) { image.setBackground(R.id.xxx1); } else if (条件2) { image.setBackground(R.id.xxx2); } 实际 ...

  6. c++对象模型探索(一)

    粗略阅读了<深度探索c++对象模型>一书后,对c++对象底层的内存布局有了一些了解,但同时,也产生了一些疑惑: 1.将子类指针用dynamic_cast转成父类指针之后,其虚表指针会相应变 ...

  7. Android广播接收者

    其实,在什么是广播的第一句就已经说明了广播有什么用了.对了,笼统一点讲就是用来传输数据的.具体一点说就是:1. 实现了不同的程序之间的数据传输与共享,因为只要是和发送广播的action相同的接受者都能 ...

  8. ListView---复杂的listview显示

    1 . 初始化数据 private void fillData() { ll_loading.setVisibility(View.VISIBLE); // 显示进度 new Thread() { p ...

  9. C++中的友元

    友元函数 在类的声明中可以声明某一个函数作为该类的友元函数,然后该函数就可以访问类中的private数据成员了. demo: /* wirten by qianshou 2013/12/6 04:13 ...

  10. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...