A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 习惯就好 中级黑马   /  2015-3-4 12:42  /  719 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

关于位移运算中的知识点:
第二十八,编程题: 用最有效率的方法算出2乘以8等於几?
  有C背景的程序员特别喜欢问这种问题。
  
 答案: 2 << 3
粗看似乎很在理,大致想来2<<3会是移位操作,在Java的字节码中移位指令是ishl(右移),而在CPU上的硬件指令可能就会是shl(算术右移指令)。其实不然,如果熟悉汇编语言,还考虑过编译优化,2<<3根本不会使用移位操作,而是在编译时就优化计算出16来了。
----------------------------------------------------------------
下面开始进行简单的说明:
通俗的说,位移的实现是将数据转换成二进制后,进行左右移动的。如果左移,则右边补零,如果是右移,则是左边补零,后边溢出的则去掉。因此,左移可以理解为整数的乘法,而右移则是理解为整数的取整除法。

C#是用<<(左移) >>(右移) 运算符是用来执行移位运算。
  左移 (<<)
  将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0
  左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8
  x<<1= x*2
  x<<2= x*4
  x<<3= x*8
  x<<4= x*16
  同理, 右移即相反:
  右移 (>>)
  将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0
  右移相当于整除. 右移一位相当于除以2;右移两位相当于除以4;右移三位相当于除以8
  x>>1= x/2
  x>>2= x/4
  x>>3= x/8
  x>>4= x/16
  当声明重载C#移位运算符时,第一个操作数的类型必须总是包含运算符声明的类或结构,并且第二个操作数的类型必须总是 int

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马