在处理16 bit数据时,时常要将其他类型数据固定在16bit。

通常来说,在C语言中用一个if或者三目运算符就可以完成这个功能:

#define Limit16(a) ((a) > 0x7FFF ? 0x7FFF : ((a) < -0x8000 ? -0x8000 : (a)))

用位运算也可以巧妙实现此功能:

short clamp16(int sample)
{if ((sample >> 15) ^ (sample >> 31)) {sample = 0x7FFF ^ (sample >> 31);   }return sample;
}

代码流程说明如下:
  • 0 < sample <= 0x7FFF:
sample >> 15 为 0;
sample >> 31 为 0;
异或后为0,跳过if,return sample;
  • sample > 0x7FFF:
sample >> 15 为 1;
这里的int假定为32位,sample >> 31 为 0;
进入if后,sample = 0x7FFF ^ 0 = 0x7FFF;
  • -0x8000 <= sample < 0:
sample >> 15 为 0xFFFFFFFF(高位为1,右移补1),负数是以补码的形式存在,大于-0x8000的数,高16位为1;
sample >> 31 为 0xFFFFFFFF,异或为0;
直接return
  • sample < -0x8000:
sample >> 15 为0xFFFFxxxx低16位不确定,不全为1,sample >> 31 为 0xFFFFFFFF;
异或后不为0,进入if;
sample = 0x7FFF ^ 0xFFFFFFFF = 0xFFFF8000; 0xFFFF8000为其补码,值为-0x8000;
虽然这样的代码可能不便于阅读,不过作为一种位运算技巧,了解一下还是挺不错的。

转载于:https://www.cnblogs.com/speedracer/p/6928649.html

用位运算实现有符号16bit数据clamp相关推荐

  1. java 无符号运算_java位运算和无符号运算

    计算机在底层使用的是二进制补码进行运算. 计算规则: 正数的原码.反码.补码是其二进制本身. 负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进 ...

  2. C语言位运算之有符号数和无符号数

    相同长度数据类型位运算 #include<stdio.h> int main(int argc, int* argv[]){int a_int1 = 0xFFFFFFFF; //有符号数负 ...

  3. c语言编程中的或逻辑的符号 符号如何输入,C语言中逻辑运算符(,||,!)和位运算符号(,|,^)...

    1. C语言中逻辑运算符(&&,||,!)和位运算符号(&,|,^)的区别 在C语言中,编程者经常混淆两组运算符:(&&,||,!)和(&,|,^).第 ...

  4. 位运算java_Java中的位运算

    Java中的位运算,说实话,工作了两年的时间里,从来没有用过一次,因为平时都是些的是业务代码,很少接触比较底层的东西,我记得第一次在代码中看到还是在HashMap的Hash算法中看到的,这次重拾Jav ...

  5. 位运算(、|、^、~、>>、<<)

    1.位运算概述 从现代计算机中所有的数据二进制的形式存储在设备中.即0.1两种状态,计算机对二进制数据进行的运算(+.-.*./)都是叫位运算,即将符号位共同参与运算的运算. 口说无凭,举一个简单的例 ...

  6. 嵌入式linux寄存器位运算,嵌入式linux C语言(一)――位运算的使用

    嵌入式linux C语言(一)――位运算的使用 ARM是内存与IO统一编址,SoC中有很多控制寄存器,通过对这些寄存器进行位运算对这些控制寄存器进行设置,进而控制外设功能.在修改寄存器某些位的过程中不 ...

  7. c语言位运算负数的实例_巧妙运用C语言位运算

    原标题:巧妙运用C语言位运算 位运算 位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果. 位运算符有: &(按位与) ...

  8. 一个C语言的基本教程—位运算篇

    文章目录 13.从底层操纵数据--位运算篇 (1). 各种数据的存储方式 #1.无符号整型 #2.有符号整型 #3.字符型 #4.浮点型 (2). 什么是位运算 (3). 移位运算 (4). 位与.位 ...

  9. 位运算(、|、^、~、>>、<<)总结

    目录 1.位运算概述 2.符号 3.常用的功能: 4.运用: 题目描述 输入描述 输出描述 ​​​​​​​ 1.位运算概述         从现代计算机中所有的数据二进制的形式存储在设备中.即 0.1 ...

最新文章

  1. CvBlobTrackerCC 多目标跟踪算法简析
  2. github上星星1万多的python教程推荐收藏
  3. 简单的五子棋操作用两种方法实现
  4. 【转】使用 lsof 查找打开的文件
  5. mysql增量脚本_mysql全量和增量备份脚本
  6. 【探索测试篇】探索无界,BUG无限,让程序猿头疼的测试技术
  7. linux那些事之 page table基本操作
  8. x86从实模式到保护模式 pdf_【自制操作系统04】从实模式到保护模式
  9. 同价位无敌?iQOO Neo配置曝光:骁龙845加持
  10. 小新 无法开机 联想_19年最“狠”轻薄本诞生 联想小新Pro 13优缺点一览
  11. 最新计算机主板参数,电脑主板参数知识
  12. cad字体安装_拿了CAD字体不知道怎么装?看过来
  13. RFID扫描APP Android
  14. C++学习第十课--构造函数详解、explicit与初始化列表笔记
  15. python实现图像二分类特异度(numpy)
  16. 酷酷资源社网站同款xiuno模板/知乎蓝魔改版源码/附多个插件
  17. math.h里的数学计算公式
  18. 1.3-15:苹果和虫子
  19. TCAM CAM 说明 原理 结构 Verilog 硬件实现
  20. qq邮箱html个签模板,qq邮箱个性签名模板

热门文章

  1. 用于最优控制的简单软件
  2. (转)API接口防止参数篡改和重放攻击
  3. 使用哪种关机方式后再启动计算机时间最长,有没有哪一种软件可以使电脑在设置好时间后自动开关机...
  4. 不使用输入框如何实现下拉_使用INFINITE AJAX SCROLL实现下拉加载效果
  5. 阶乘c 语言代码,求10000的阶乘(c语言代码实现)
  6. 拉取网页_用命令行管理你的 GitHub 项目,不必再开网页,官方 CLI 工具 1.0 版上线...
  7. python加密文件_用 Python 加密文件
  8. chart.js雷达图不显示刻度标签_Matplotlib从入门再也不放弃
  9. 小程序飞入购物车特效
  10. php相册上传和删除吗,php如何删除上传图片