为了账号安全,请及时绑定邮箱和手机立即绑定

C#移位运算问题

C#移位运算问题

C#
慕哥6287543 2018-07-31 13:13:45
public class exe{public static void Main(){int a, b, c;c = 0x1af034;a = (c >> 16) & 0xffff;b = c & 0x00ff;Console.WriteLine("a is {0}",a );Console.WriteLine("b is {0}",b );Console.Read();}}请问这里为什么(c >> 16) & 0xffff的值会是26?还有c & 0x00ff的值为什么是52?
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

1、 c >> 16 = 0x1AF034 >> 16 = 0x00001A 0x00001A & 0x00FFFF = 0x00001A = 26 2、 c & 0x0000FF = 0x1AF034 & 0x0000FF = 0x000034 = 52 位移运算就是将数字的二进制形式按指定的位数左移或右移,因为十六进制的每位数可以化成一个四位数的二进制的数字(2的四次方为16),所以在二进制中移动16位就是在十六进制中移动16/4 = 4位,那么0x1AF034 >> 16 = 0x00001A 按位且(&)这个运算符,这个运算符的意思是将数字转为二进制逐位进行且比较,按照1且1为1,1且0为0,0且0为0的规则,这样拆开来运算后再整合为结果 其实有个快捷方法,还是因为十六进制的每位数可以化成一个四位数的二进制的数字(2的四次方为16),而且0x0 = 0000B,0xF = 1111B,也就是说如果对应位上数是F,那么这位上的数可以保留,否则变为0,如上面的0x0000FF & 0x1AF034,你可以看到前面的数字只有个位和十位上有数字,所以只保留后面数字的个位和十位就是结果,那么就是0x000034 = 52了

1


查看完整回答
反对 回复 2018-08-07
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

1、
c >> 16 = 0x1AF034 >> 16 = 0x00001A
0x00001A & 0x00FFFF = 0x00001A = 26

2、
c & 0x0000FF = 0x1AF034 & 0x0000FF = 0x000034 = 52

位移运算就是将数字的二进制形式按指定的位数左移或右移,因为十六进制的每位数可以化成一个四位数的二进制的数字(2的四次方为16),所以在二进制中移动16位就是在十六进制中移动16/4 = 4位,那么0x1AF034 >> 16 = 0x00001A

按位且(&)这个运算符,这个运算符的意思是将数字转为二进制逐位进行且比较,按照1且1为1,1且0为0,0且0为0的规则,这样拆开来运算后再整合为结果
其实有个快捷方法,还是因为十六进制的每位数可以化成一个四位数的二进制的数字(2的四次方为16),而且0x0 = 0000B,0xF = 1111B,也就是说如果对应位上数是F,那么这位上的数可以保留,否则变为0,如上面的0x0000FF & 0x1AF034,你可以看到前面的数字只有个位和十位上有数字,所以只保留后面数字的个位和十位就是结果,那么就是0x000034 = 52了

查看完整回答
反对 回复 2018-08-07
  • 2 回答
  • 0 关注
  • 1007 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信