(原创)c#学习笔记04--流程控制01--布尔逻辑02--按位运算符

4.1.2  按位运算符

  &和 | 运算符还有一个作用:对数值执行操作。以这种方式使用时,它们处理的是变量中存储的一系列位,而不是变量值,因此它们称为按位运算符。

  下面先讨论&和 |。&运算符第一个操作数中的每个位都与第二个操作数中相同位置上的位进行比较,在得到的结果中,各个位置上的位如表4-5所示。

  | 运算符与此类似,但得到的结果位是不同的。如表4-6所示。

  

  ^运算符的用法与此相同。如果操作数中相同位置上的位有且仅有一个是1,其结果位就是1,如表4-7所示。

  

  C#中还可以使用一元位运算符~,它将操作数中的位取反,其结果应是操作数中位为1的,在结果中就是0,反之亦然,如表4-8所示。

  

  整数存储在.NET中的万式称为2的补位,即使用一元运算符~会使结果看起来有点古怪。假定int类型是一个32位的数字,则运算符~对所有32位进行操作,将有助于看出这种方式。例如,数字5的完整二进制表示为:

    000000000000000000000000000000101

  数字-5的完整二进制表示为:

    111111111111111111111111111111011

  实际上,按照2的补位系统,(-x)定义为(~x+1)。这个系统在把数字加在一起时非常有用。例如,把10和-5加起来(即从10中减去5)的二进制表示为:

     000000000000000000000000000001010

    + 111111111111111111111111111111011

    =   1000000000000000000000000000000101

  note: 忽略最左端的1,就得到5的二进制表示。像~1=2这样的式子比较古怪,其原因是底层的结构强制生成了这个结果。

  除了这4个按位运算符外,本节还要介绍另外两个运算符,如表4-10所示。

  

  这些运算符通常称为位移运算符,最好用一个简单的示例加以说明:

    int var1, var2 = 10, var3 = 2;

    var1 = var2 << var3;

  结果,varl的值是40。具体过程如下:10的二进制值是1010,把该数值向左移动两位,得到101000,即十进制中的40。 实际上,是执行了乘法操作。每向左移动一位,该数都要乘以2,所以向左移动两位,就给原来的操作数乘以4(2 * 2)。而每向右移动一位,则是给操作数除以2,并丢弃非整余数:

    int var1, var2 = 10;

    var1 = var2 >> 1;

  在这个示例中,var1的值是5,而下面的代码得到的值是2:

    int var1, var2 = 10;

    var1 = var2 >> 2;

  在大多数代码中,都不使用这些运算符,但应知道有这样的运算符存在。它们主要用于高度优化的代码,在这些代码中,不使用其他数学操作。因此它们通常用于设备驱动程序或系统代码。

  位移运算符也有赋值运算符,如表4-11所示。

  

时间: 2024-10-10 16:47:26

(原创)c#学习笔记04--流程控制01--布尔逻辑02--按位运算符的相关文章

python学习笔记3—流程控制if、for、while

流程控制if if 语句 if expression: statement(s) else else语句: if 语句,else语句 if expression: statement(s) else: statement(s) elif语句: if expression1: statement1(s) elif expression2(s): statements2(s) else: statement2(s) 注:Python使用缩进作为其语法分组的方法,建议使用4个空格 逻辑值(bool)包

【原】Java学习笔记005 - 流程控制

1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 // 程序的流程控制(流程结构):顺序结构.选择结构.循环结构 6 7 // 顺序结构:从上向下,顺序执行 8 System.out.println("出生..."); 9 System.out.println("享受人生..."); 10 System.out.print

No2. 学习笔记_流程控制

1 import java.util.Scanner; 2 public class HelloForWhile { 3 4 /** 5 * 文档注释,程序名称:HelloForWhile 流程控制 开发时间:2016-03-07 作者:嘿嘿 6 * */ 7 public static void main(String[] args) { 8 // TODO Auto-generated method stub 9 System.out.println("test"); 10 int

JavaScript学习笔记——javascript流程控制

javascript流程控制流程:就是程序代码的执行顺序.流程控制:通过规定的语句让程序代码有条件的按照一定的方式执行. 一.顺序结构 按照书写顺序来执行,是程序中最基本的流程结构. 二.选择结构(分支结构.条件结构) 根据给定的条件有选择的执行形相应的语句. (1) if else if else 1.单路分支 //条件可以是表达式也可以是任何的数据类型 //大括号会把他里面的代码当作一个整体来运行,如果只有一条语句,可以省略大括号 if(条件){ 条件成立执行的语句 } 2.双路分支 if(

(原创)c#学习笔记04--流程控制03--分支01--三元运算符

4.3  分支 要跳转到的代码行由某个条件语句来控制.这个条件语句使用布尔逻辑,对测试值和一个或多个可能的值进行比较. 本节介绍C#中的3种分支技术: ?  三元运算符 ?  if语句 ?  switch语句 4.3.1  三元运算符 一元运算符有一个操作数,二元运算符有两个操作数,所以三元运算符有3个操作数.其语法如下: <test> ? <resultIfTrue>: <resultIfFalse> 其中,计算<test>可得到一个布尔值,运算符的结果根

(原创)c#学习笔记04--流程控制04--循环04--循环中断和无限循环

4.4.4  循环的中断 有时需要更精细地控制循环代码的处理.C#为此提供了4个命令,其中的3个已经在其他情形中介绍过了:?  break——立即终止循环.?  continue——立即终止当前的循环(继续执行下一次循环).?  goto——可以跳出循环,到已标记好的位置上(如果希望代码易于阅读和理解,最好不要使用该命令).?  return——跳出循环及其包含的函数(参见第6章).?  break命令可退出循环,继续执行循环后面的第一行代码 4.4.5  无限循环 可以通过编写错误代码或错误的

(原创)c#学习笔记04--流程控制03--分支03--switch语句

4.3.3 switch语句 switch 语句非常类似于if 语句,因为它也是根据测试的值来有条件地执行代码.但是,switch语句可以一次将测试变量与多个值进行比较,而不是仅测试一个条件.这种测试仅限于离散的值,而不是像“大于X”这样的子句,所以它的用法有点不同,但它仍是一种强大的技术. switch语句的基本结构如下: switch (<testVar>) { case <comparisonVal1>: <code to execute if <testVar&

(原创)c#学习笔记04--流程控制02--goto语句

4.2 goto语句 C#允许给代码行加上标签,这样就可以使用goto语句直接跳转到这些代码行上.该语句优缺点并存.主要的优点是:这是控制什么时候执行哪些代码的一种简单方式.主要的缺点是:过多地使用这个技巧将使代码晦涩难懂. goto语句的用法如下: goto <labelName>; 标签用下述方式定义: <labelName>: 例如,下面的代码: int myInteger = 5; goto myLabel; myInteger += 10; myLabel: Consol

【原】Java学习笔记007 - 流程控制

1 package cn.temptation; 2 3 public class Sample01 { 4 public static void main(String[] args) { 5 // for循环 6 // 格式 7 // for (int i = 初始值; i < value; i++) { 8 // 9 // } 10 // 口诀:左初值.右步长.条件在中间.处理在内部 11 // 1.左初值:声明一个变量并给变量赋值 12 // 2.右步长:控制左边声明的变量的变化幅度,为