在C语言学习的过程中,边学边练习是一个锻炼思维的一种好方法。
其实位运算,的用非常多,比如颜色运算,嵌入式,以及逻辑电路等用的最多的。

下面我就用我们学到C语言知识位运算来实现一个Ps的功能 - 反向
首先我们先知道Ps的反向功能在哪,没有接触Ps的各位C友们这里教一下大家。
填充一个颜色为66ccff

然后执行反向,这里你可以用Ctrl+I或者在图像->调整->反向

瞬间变了一种颜色,色值为993300
这是让我想到了RGB色值,66ccff的色值为102,204,255
则反向过后的色值为993300的色值为153,51,0

这让我很惊讶,255变成了0这就很符合位运算的反取操作符的要求
255色值的二进制位 11111111反取之后正好是00000000

代码思路安排,第一版,因为方法不止一个,有很多个。
先看第一个方法,也是最好的。

#include <stdio.h>
#include <stdlib.h>
typedef unsigned char u8_t;             /** 使用typedef建立一个uint8_t类型* char虽然是字符型,但它也能存储整形* 取值范围在0~255* 一旦超出255会溢出*/
void reverse ( void )
{u8_t R , G , B ,                                // 用于用户输入rR , rG , rB;                           // 用于做去反操作printf ( "Input RGB Color Value: " );scanf ( "%hhd %hhd %hhd" , &R , &G , &B );           /** 记住这里只能用%hhd(8位整形,全称: short short decimal)来输入.* 绝对不能用%d(32位整形,全称: decimal),否则会出现溢出现象.* gcc也会报警告说,你必须把%d改为%s.* 好了这里不多说了,有点啰嗦!*/rR = ~R ,rG = ~G,rB = ~B;/** 这里做位运算的反取操作符* 例如我输入的数值是: 255        二进制是8个1* 转为二进制为:      11111111 反取之后 00000000* 比如我喜欢66ccff这个hex颜色值* rgb是: 102 205 255* 转二进制: 102 == 1100110  反取之后 0011001* 转二进制: 204 == 11001100 反取之后 00110011* 转二进制: 255 == 11111111  反取之后 00000000* 66ccff 反取之后就变成了 993300*/printf ( "Orginal RGB Color Value: %-2d %-2d %-2d\n",R , G , B );printf ( "Reverse RGB Color Value: %-2d %-2d %-2d  " , rR , rG , rB );/** 打印是不要使用%hhd,打印是会出溢出的情况。* 必须是%hhd以上的类型比如: %hd %d %ld.* 使用%hd或者%d就行了。*/
}int main ( int argc , char *argv[] )
{while ( 1 ){system ( "cls" );reverse ( );getchar ( );getchar ( );}return 0;
}

这是第一个方法,使用位运算的反取操作符来实现的。
当然还有一种方法也能实现位运算的操作,就是使用减法,我们刚刚看了一下,255的二进制是8个1,反向过来是0,那么255-255是不是就等于0呀,第二个思路出来了。

#include <stdio.h>
#include <stdlib.h>
#define RGB_MAX_VALUE   255             // RGB最大数值
typedef unsigned char u8_t;             /** 使用typedef建立一个uint8_t类型* char虽然是字符型,但它也能存储整形* 取值范围在0~255* 一旦超出255会溢出*/
void reverse ( void )
{u8_t R , G , B ,                                // 用于用户输入rR , rG , rB;                           // 用于做去反操作printf ( "Input RGB Color Value: " );scanf ( "%hhd %hhd %hhd" , &R , &G , &B );           /** 记住这里只能用%hhd(8位整形,全称: short short decimal)来输入.* 绝对不能用%d(32位整形,全称: decimal),否则会出现溢出现象.* gcc也会报警告说,你必须把%d改为%s.* 好了这里不多说了,有点啰嗦!*/rR = RGB_MAX_VALUE - R ,rG = RGB_MAX_VALUE - G,rB = RGB_MAX_VALUE - B;/** 这里使用RGB最亮的数值255,255 255 255就是RGB颜色最亮的颜色。* 用最亮的颜色减去当前颜色,就能得到反向的颜色。*/printf ( "Orginal RGB Color Value: %-2d %-2d %-2d\n",R , G , B );printf ( "Reverse RGB Color Value: %-2d %-2d %-2d  " , rR , rG , rB );/** 打印是不要使用%hhd,打印是会出溢出的情况。* 必须是%hhd以上的类型比如: %hd %d %ld.* 使用%hd或者%d就行了。*/
}int main ( int argc , char *argv[] )
{while ( 1 ){system ( "cls" );reverse ( );getchar ( );getchar ( );}return 0;
}

好了关于位运算的知识就聊到这里,希望大家能在编程的路上发现更多新的大陆。

C语言位运算-实现Photoshop反向功能相关推荐

  1. (转)C语言位运算详解

    地址:http://www.cnblogs.com/911/archive/2008/05/20/1203477.html C语言位运算详解 作者:911 说明:本文参考了http://www2.ts ...

  2. C语言位运算,醍醐灌顶式教学

    C语言位运算,醍醐灌顶式教学 学习计算机的都了解,位运算其实以一种比较快速的运算,对于大型应用程序,可以节约很多运算时间.但是很多人都不了解,下面我来给大家大致讲解一下C语言中各种位运算符.(小声bb ...

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

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

  4. c语言位运算(c语言回文数编程)

    C语言的位运算 <>2;/其实这些符号都是差不多的用法;///PUR0 = PUR0 | 0X20;/,就是相当于R0CONH = R0CONH & 0XFC;/left shif ...

  5. c语言位运算负数的实例_0基础学习C语言第三章:位运算

    C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移,相当与*2 >> 右移,正数高位补0,负数由计算机决定 循环左移k次 (x< ...

  6. 单片机c语言或运算,单片机avr c语言位运算 与或非 异或逻辑 运算介绍 详解

    位运算是指按二进制位进行的运算.在单片机中位运算通常用于I/O端口的输入输出控制和逻辑判断. C语言提供的位运算符有: 运算符 含义 功能 & 按位与 如果两个相应的二进制位都为1,则该位的结 ...

  7. c语言位运算符的应用,c语言位运算(c语言位运算符的用法)

    a=1^8 b=32^32 c=7^3 d=4&3 e=4|3 f=1&-1 求值 求详解 求值 为什么等于这么. 一.位运算符C语言提供了六种位运算符:& 按位与 | 按位或 ...

  8. c语言位运算试题及解析,C语言面试题分类-位运算

    1.不用临时变量交换两个整数. a = a ^ b; b = a ^ b; a = a ^ b; 2.实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如9的二进制是1001,则输出2. i ...

  9. c语言位运算负数的实例_一招教你学会C语言中位运算

    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.注意,位运算只针对于整数进行操作. 运算符号 运算规则 1.&与运算:对应两个二进 ...

  10. sizeof是c语言的一种运算符,C语言位运算和sizeof运算符详解

    位运算和sizeof运算符 C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的.位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果.位运算主要有 ...

最新文章

  1. php include include_once 区别,「PHP」include()、include_once()、require()、require_once()的用法及区别...
  2. AI产品之路:神经元与神经网络
  3. 201506251117_《react——所需知识、主要技术》
  4. sql注入问题-视图-事物-以及存储过程(可视化工具)
  5. 直播协议HTTP-FLV标准解读与技术实现
  6. 【瞎搞】 Codeforces Round 276 DIV 2 C.Bits
  7. matlab2014a 3d标定,[转载]张的matlab摄像机标定
  8. android 实现SSL握手协商
  9. rx ajax,ajax_RxJS 中文文档_w3cschool
  10. tocmat类加载:正统的类加载
  11. 【java】Java实现单向链表反转
  12. 用 Python 爬取 4332 条数据,揭秘甜咸肉粽的江湖!
  13. IDEA安装mysql程序包,程序包的下载!以及程序包配置到项目详解(更适合英语小白)
  14. 预处理命令(宏定义,条件编译,头文件)
  15. js 动态生成表格案例
  16. 无纸化办公软件app 快用这款科学处理办公事宜的便签
  17. mysql 批量导入_MySQL快速大量导入
  18. PayPal WebHook事件异步通知
  19. MediaWiki配置
  20. ndo2db: Warning: Retrying message send. This can occur

热门文章

  1. CentOS 7 iSCSI 多路径(Multipath)配置
  2. 写给即将入行的程序员的一封信
  3. 【Python】Pymyql模块的execute()总结
  4. 如何避免PayPal、Fb、谷歌账户被封,又如何解封?
  5. 故事会-设计模式-策略模式
  6. android studio实现记住密码,Andriod Studio实现保存QQ密码功能(案例代码详解)
  7. 微信小程序项目实例——双人五子棋
  8. python中localtime和gtime的区别及时区计算的代码
  9. 解决在浏览器中打开java文件jnlp报错“该文件没有程序与之关联来执行该操作...”
  10. 别人眼中的程序猿和现实中的程序猿差别在哪?