活動小丑 发表于 2021-6-26 17:23:20

C语言位运算实现-Ps颜色反向

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

下面我就用我们学到C语言知识位运算来实现一个**Ps的功能        -        反向**
首先我们先知道**Ps的反向**功能在哪,没有接触Ps的各位C友们这里教一下大家。
填充一个颜色为66ccff
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210626093822944.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NDEwOTM2,size_16,color_FFFFFF,t_70#pic_center)
然后执行反向,这里你可以用Ctrl+I或者在图像->调整->反向
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210626093942199.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NDEwOTM2,size_16,color_FFFFFF,t_70#pic_center)
瞬间变了一种颜色,色值为993300
这是让我想到了RGB色值,66ccff的色值为102,204,255
则反向过后的色值为993300的色值为153,51,0

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

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

```c
#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呀,第二个思路出来了。

```c
#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;
}
```
好了关于位运算的知识就聊到这里,希望大家能在编程的路上发现更多新的大陆。
页: [1]
查看完整版本: C语言位运算实现-Ps颜色反向