码迷,mamicode.com
首页 > 其他好文 > 详细

二进制

时间:2015-10-21 19:26:36      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:c中二进制的精彩

十进制转二进制:

用2辗转相除至结果为1,将余数和最后的1从下到上倒序写,就是结果

例:302

302\2=151余0

151\2=75余1

75\2=37余1

37\2=18余1

18\2=9余0

9\2=4余1

4\2=2余0

2\2=1余0

故二进制为100101110

二进制数的按位移动:

一:左移:

左移是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如:

int i=1;

i=i<<2;//把i里的值左移2位

        也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关),左移2位之后变成000...0100,也就是10进制的2,所以说左移一位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全是用,因为左移可能导致符号位的变化),解释如下:
注意:

  1. int类型最左端的符号位

  2. 移位移出去的情况

,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:

int i = 0x40000000; //16进制的40000000,2进制表示为:01000000...0000
i = i << 1;

        那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.

        左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:

int i = 1, j = 0x80000000; //设int为32位
i = i << 33;   // 33 % 32 = 1 左移1位,i变成2
j = j << 33;   // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃

总之左移就是: 丢弃最高位,0补最低位
二:右移.

        右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.,右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:

int i = 0x80000000;
i = i >> 1;  //i的值不会变成0x40000000,而会变成0xc0000000

        就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.

     负数10100110 >>5(假设字长为8位),则得到的是  11111101

总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多. 

例题:

  (1)unsigned char x=3; 

  x<<1是多少?x>>1是多少? 

  (2)char x=3; 

  x<<1是多少?x>>1是多少? 

  (3)char x=-3; 

  x<<1是多少?x>>1是多少? 
答案:
  3写成二进制数是00000011;-3写成二进制数是(补码)11111101。 

  程序执行的时候,操作的是数值的编码表示,也就是数值在内存中的二进制表示。比如说,程序取-3的时候,就去取11111101。 

  (1)对无符号数3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成00000110,所以结果是6;x>>1往右边移一位,由于是无符号数,所以逻辑右移,最右边一位移掉,最左边移进来的位补零,变成00000001,所以结果是1。

  (2)对于有符号数3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成00000110,所以结果是6;x>>1往右边移一位,由于是有符号数,可能发生逻辑右移,也可能发生算术右移,这一点,C标准并没有明确地指定是使用逻辑右移还是算术右移。但大多数的机器都使用算术右移,变成00000001,所以结果还是1。

  (3)对于有符号数-3来说,x<<1往左移一位,最左边的位移掉了,最右边的移进来的位补零。变成11111010,结果是-6。往右移一位,由于是有符号数,可能发生逻辑右移,也可能发生算术右移。大多数机器使用算术右移,变成11111110,结果是-2。 

  总结:左移时总是移位和补零。右移时无符号数是移位和补零,此时称为逻辑右移;而有符号数大多数情况下是移位和补最左边的位(也就是补最高有效位),移几位就补几位,此时称为算术右移。 

 参考资料:http://hi.baidu.com/todaygoodhujun/blog/item/b8c10dd15ae4dfd3572c8417.html 

二进制

标签:c中二进制的精彩

原文地址:http://10798301.blog.51cto.com/10788301/1704943

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!