zoukankan      html  css  js  c++  java
  • C/C++ uchar的一个有趣用法


    本系列文章由 @yhl_leo 出品,转载请注明出处。
    文章链接: http://blog.csdn.net/yhl_leo/article/details/51377490


    图像处理中常常使用的一种数据类型uchar,一般它指的就是unsigned char,可以查到它的定义为:

    typedef unsigned char uchar;

    是一种8-bit无符号整形数据,范围为[0, 255](与之相对应的是schar,定义为typedef signed char schar,取值范围是[-128, 127]),与8-bit图像的灰度级[0, 255]一一对应,所以图像灰度操作的时候经常使用(十六进制的0xff对应于十进制的255)。

    #define CHAR_BIT      8         /* number of bits in a char */
    #define SCHAR_MIN   (-128)      /* minimum signed char value */
    #define SCHAR_MAX     127       /* maximum signed char value */
    #define UCHAR_MAX     0xff      /* maximum unsigned char value */

    接下来说一说有趣的用法:

    cout << int( (uchar)-1 ) << endl;

    这句的结果会是什么呢?首先句代码是可以编译通过的,输出结果是255!

    -1对应的有符号整形二进制为:11111111,获得方式如下:

    //#include <bitset> 
    ...
    
        std::bitset<sizeof(signed char)*8> a(-1);
        cout << a << endl;
    
    // print: 11111111

    所以(uchar)-1可以视为是在进行与运算:

      1 1 1 1 1 1 1 1 // AND
      & & & & & & & &
      1 1 1 1 1 1 1 1

    这里用&表示与运算吧,因此对应的二进制结果仍为11111111,也就是十进制的255

    同理如果是(uchar)-2,对应的就是254~

    此外,语句(uchar)~0(uchar)-1如出一辙:从左往右,依次进行位取反和位与运算:

    ~ 0 0 0 0 0 0 0 0 // NOT
      | | | | | | | |
      1 1 1 1 1 1 1 1 // AND
      & & & & & & & &
      1 1 1 1 1 1 1 1

    因此,可得:

    bool issame = (uchar)~0 == (uchar)-1;
    cout << issame << endl;
    
    // print: 1
  • 相关阅读:
    JS制作图表
    把图片存入数据库
    .NET各种小问题
    JS各种小问题
    JS操作cookie
    JS处理Json数据
    git与svn的区别
    关于java中的一些循环
    java基础面试(上)
    Spring事务
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332133.html
Copyright © 2011-2022 走看看