位移

如果sizeof(int) = 4,那么下面的代码的结果是什么?

int x=255; printf("%d", x>>34);

实际输出:63

在编译这个代码时,编译器会给出警告

[Warning] right shift count >= width of type [enabled by default]

(这时假设位移运算位移步数只能在[0, type_bit_width)范围内)位移操作会对其位移步数对数值位宽(这里int类型为32位)做一次求余操作即上述代码等同于

x >> (34 % 32)

实际上上述的等同不完全正确,当位移步数是负数时

x >> -1 // 0

这时通过%操作不能把位移步数转化到[0, type_bit_width)范围内(-1 % 32 = -1)

更为正确的我们可以用以下代码来等效(商向负无穷取整的一种取余方式,正数:n % m,负数:n % m + m,详见“取余”一节)

int shift = -1
int q = floor(shift / 32.0);
double r = i - q * 32.0;
x >> (int)(r)

可以写一段代码进行测试

#include <stdio.h>
#include <math.h>
int main() {
for (int i=-1; i>-65; i--) {
int sh = i;
int q = (int)floor(sh / 32.0);
double r = sh - q * 32;
printf("custommod: q = % d, r = % g\n", q, r);
int xn = 255;
printf("%d>>%d = %d\n", xn, sh, xn>>(sh));
}
return 0;
}

输出见:http://codepad.org/RzYr6fkI

取余

取余围绕一下公式进行

q * b + r = a

其中q = [a / b],r为余数。

但当a / b为一个浮点数时,它向那个方向取整决定了余数r的取值

  • %:朝0取整(a/b为正时向负方向取整,为负时向正方向取整)

下面给出一个比较代码(c中的%操作和上一节中自定义的取余方式)

     for (int i=-; i<; i++) {
if (i == ) continue;
printf("(%2d, %d)\n", i, );
printf("%% : q = % d, r = % d \n", i / , i % );
int q = floor(i / 3.0);
double r = i - q * ;
printf("custommod: q = % d, r = % g\n", q, r);
}

运行结果见:http://codepad.org/jSmd5Jnq

另外c语言math库中另有一些取余函数:

  • remainder:商向最接近的整数取整
  • remquo:商向最接近的整数取整
  • fmod:商直接截断小数部分(即向0取整),与%运算符一致

另外在python中%的行为模式与上文自定义的那个取余方式一致见代码:http://codepad.org/XFangjmO

参考:

  http://www.cplusplus.com/reference/cmath/remainder/

  C traps & pitfalls

  http://blog.csdn.net/huasion/article/details/6855900

C Traps:运算的更多相关文章

  1. C Traps:优先级常见错误

    逻辑与关系运算符 if (flags & FLAG != 0) {...} 这类错误以前也犯过,因为!=的优先级比&要高所以实际上是这样的 if (flags & (FLAG ...

  2. PHP赋值运算

    1. 赋值运算:= ,意思是右边表达式的值赋给左边的运算数. $int1=10; $int1=$int1-6; //$int1=4 echo $int1,"<br>"; ...

  3. javascript中的浮点数运算

    解释一下下面代码的输出 console.log(0.1 + 0.2); //0.30000000000000004 console.log(0.1 + 0.2 == 0.3); //false Jav ...

  4. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  5. 妥协与取舍,解构C#中的小数运算

    题外话 正文开始之前,我首先要感谢博客园提供的这个优秀的平台.通过在这个优秀的平台上和很多志同道合的朋友交流,互相帮助,我也很荣幸的获得了15年的微软MVP的奖项.也使我更加坚信了代码改变世界.感激! ...

  6. 简简单单学会C#位运算

    一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...

  7. pyhton学习笔记(基础五:数据类型、数据运算)

    数据类型初识 1. 数字 整数:2是一个整数的例子 长整数 不过是大一些的整数 3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示52.3*10-4. (-5+4j ...

  8. JS-- 浮点数运算处理

        一. 问题描述 最近在做一个项目,页面上会存在一些JS浮点数的运算,发现JS浮点数运算存在一些bug.譬如: 0.1+0.2 == 0.30000000000000004 0.1 + 0.7 ...

  9. [LeetCode] Plus One Linked List 链表加一运算

    Given a non-negative number represented as a singly linked list of digits, plus one to the number. T ...

随机推荐

  1. Android安全防护防护———Android 端常见的安全问题

    Android安全防护防护——加密算法:传送门https://www.cnblogs.com/huangjialin/p/9694488.html 组件安全 activity劫持 简单来说就是正常的a ...

  2. centOS 自动锁屏 解决办法

    System-->preferences --> Screensaver中 找到 Lock screen when screensaver is active 把前面的钩去掉

  3. SSL学习笔记

    /************************************数据类型***************************************//* Number(数值型),Bool ...

  4. webpack快速入门——配置文件:服务和热更新

    1.在终端安装 cnpm i webpack-dev-server --save-dev 2.配置好后执行 webpack-dev-server,这时候会报错 出现错误,只需要在pagejson里配置 ...

  5. js有关数组的函数

    map()和filter()函数 js的数组迭代器函数map和filter,可以遍历数组时产生新的数组,和python的map函数很类似1)filter是满足条件的留下,是对原数组的过滤(筛选):2) ...

  6. 网络请求 爬虫学习笔记 一 requsets 模块的使用 get请求和post请求初识别,代理,session 和ssl证书

    前情提要: 为了养家糊口,为了爱与正义,为了世界和平, 从新学习一个爬虫技术,做一个爬虫学习博客记录 学习内容来自各大网站,网课,博客. 如果觉得食用不良,你来打我啊 requsets 个人觉得系统自 ...

  7. 实验三:分别用for、while和do-while循环语句以及递归方法计算n!,并输出算式

    一.用for循环计算n! package for_package; import java.util.*;//导入含有输入类的包 public class for_class { /** * @par ...

  8. python 批量模块导入(笔记)

    环境:python3.6 目的:根据列表['os', 'sys', 're']中的字符串导入对应模块 from importlib import import_module modules = ['o ...

  9. 利用BitviseSSH免root实现Windows vs Linux的文件互传

    虚拟机截图,,,质量有点差,大家看看! ------------------- 在拿不到Linux root账户的情况下,winscp等工具是无法实现文件传输的,此时我们可以借用Bitvise SSH ...

  10. Spring Security构建Rest服务-0100-前言

    一.我的前言 这是看慕课网老师讲的SpringSecurity的学习笔记,老师讲的很好,开篇就说到了我的心里,老师说道: 有一定经验的程序员如何提升自己? 1,每天都很忙,但是感觉水平没有提升 2,不 ...