当前位置:  开发笔记 > 编程语言 > 正文

一些随机的C问题(ascii魔术和按位运算符)

如何解决《一些随机的C问题(ascii魔术和按位运算符)》经验,为你挑选了1个好方法。

我正在尝试学习C编程,我正在研究一些源代码,还有一些我不理解的东西,特别是关于Bitwise运算符.我在这上面阅读了一些网站,我对他们的工作有了一个了解,但当我回过头来看看这些代码时,我无法理解他们使用的原因和方式.

我的第一个问题与按位运算符无关,而是与ascii魔法有关:

    有人可以向我解释下面的代码是如何工作的吗?

    char a = 3;
    int x = a - '0';
    

    我理解这是为了将char转换为int,但我不理解它背后的逻辑.为什么/如何运作?

    现在,关于按位运算符,我觉得我真的迷失了.

    这段代码有什么作用?

    if (~pointer->intX & (1 << i)) { c++; n = i; }
    

    我在某处读到了〜反转位,但是我没看到这个语句在做什么以及为什么这样做.

    与此行相同:

    row.data = ~(1 << i);
    

    其他问题:

    if (x != a)
      {
        ret |= ROW;
      }
    

    | =运算符究竟在做什么?从我读到的,| =是OR,但我不太明白这句话是做什么的.

    有没有办法重写这段代码,以便更容易理解,以便它不使用这个按位运算符?我发现他们很难理解,所以希望有人能指出我正确的方向,了解他们如何更好地工作!


我现在对按位运算符有了更好的理解,现在整个代码更有意义.

最后一件事:似乎没有人回应是否有一种"更清洁"的方式来重写这段代码的方式更容易理解,也许不是"bitlevel".有任何想法吗?



1> Daniel Earwi..:

这将产生垃圾:

char a = 3; 
int x = a - '0';

这是不同的 - 请注意引号:

char a = '3'; 
int x = a - '0';

char数据类型存储了许多标识符的字符.数字0到9的字符在字符代码列表中彼此相邻,所以如果从"9"的代码中减去"0"的代码,则得到答案9.所以这将转为数字字符代码转换为数字的整数值.

(~pointer->intX & (1 << i))

if如果该语句非零,则该语句将被解释为true.使用了三种不同的按位运算符.

〜运算符翻转数字中的所有位,如果pointer->intX01101010,那么~pointer->intX将是10010101.(注意,在整个过程中,我说明了一个字节的内容.如果它是一个32位整数,我必须写入32位的1和0).

&运算符通过分别处理每个位将两个数字组合成一个数字.如果两个输入位均为1,则结果位仅为1.因此,如果左侧是00101001和右侧00001011,则结果为00001001.

最后,<<意味着左移.如果你从00000001开始并将它移动三个位置,你将有00001000.所以表达式(1 << i)产生一个值,其中第i位被打开,其他都被关闭.

将它们放在一起,它会测试位i是否被关闭(零)pointer->intX.

所以你可以弄清楚是什么~(1 << i).如果i4,括号中的东西将是00010000,所以整个事情将是11101111.

ret |= ROW;

那相当于:

ret = ret | ROW;

|操作者是一样&,除了将得到的位为1,如果任一所述输入比特的是1.所以,如果ret00100000ROW00000010,其结果将是00100010.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有