位运算.位移运算(原码,补码,反码)

08-08 游戏 投稿:聊清漪
唐三 2013-05-08 03:53:27 2023-07-31 11:00:15

2 3 结果为 16,实际就是 2 的 (3+1) 次方,2 0 结果为 2,即 2 的 1 次方

Byte 转 M:10 * 1024 * 1024 = 10 M,使用左位移实现:10 20

基本概念:

以下对于有符号的数据而言:(java的数据全是有符号的,C语言才有无符号数据)

1、正数的原码,反码,补码都一样。

2、负数的反码 = 它的原码符号位不变,其他位取反

3、负数的补码 = 它的反码+1

4、0的反码,补码都是0

5、在计算机运算时,都是以补码的方式运算的

位运算就是照上面把数据转成二进制以bit存放后来运算。

注意:按位取反连符号位也要取反。按位取反运算符是 这个符号 lsquo; ~ rsquo; (在数字1的隔壁)

注意:位运算是以补码方式运算的,结果也是补码,如果发现补码是负数,那就要转换成原码。

位移运算:

算数右移:比如int型是4个字节就是32bit,把这32bit的内存看作或者站台,刚好一辆32个车厢的火车正好对位停在这。算数右移动就是就以最低位那个作为火车头,向右移几位就是火车向右开几个车厢。向右边开走了5个车厢的话那么左边站台就空出5个车厢的位置了,那么就复制符号位来填满这5个位置。(符号位是1就填充了5个1,是0就填了5个0咯)

算数左移:这个简单,符号位是不变的,火车往做开,空出的位置全部用0补上。 (这就相当于每左移一位就相当于乘以了个2,如1 2 = 1 x 2 x 2 = 4 . 负数一样 -1 2 就等于-4,因为移动时符号位不变 ),这样就有个有有意思面试题:请将一个数以最快的执行效率让他变成他的两倍。 让一个数比如说100变成两倍不就是 100 * 2 不就等于200了 吗? 是。 但是还可以: 100 1 也等于200, 用*运算符是没有位运算符快的,位运算符直接操作内存那个叫快啊,比*好快多多了! 同样想得到100的8次方是多少就是 2左移多少位等于100

逻辑右移:这个其实就算是算数左移动反方向,同样是补0 , 就是算数左移在倒车。

来做几个例:

3 1//3是二进制11,因为是证书,一看就出来了结果是13 2//移动2位就是0了,只要移2为以上都是0

声明:生活头条网所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系admin@gdcyjd.com