我正在尝试学习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".有任何想法吗?
这将产生垃圾:
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->intX
是01101010
,那么~pointer->intX
将是10010101
.(注意,在整个过程中,我说明了一个字节的内容.如果它是一个32位整数,我必须写入32位的1和0).
&运算符通过分别处理每个位将两个数字组合成一个数字.如果两个输入位均为1,则结果位仅为1.因此,如果左侧是00101001
和右侧00001011
,则结果为00001001
.
最后,<<
意味着左移.如果你从00000001开始并将它移动三个位置,你将有00001000.所以表达式(1 << i)产生一个值,其中第i位被打开,其他都被关闭.
将它们放在一起,它会测试位i
是否被关闭(零)pointer->intX
.
所以你可以弄清楚是什么~(1 << i)
.如果i
是4
,括号中的东西将是00010000
,所以整个事情将是11101111
.
ret |= ROW;
那相当于:
ret = ret | ROW;
的|
操作者是一样&
,除了将得到的位为1,如果任一所述输入比特的是1
.所以,如果ret
是00100000
和ROW
是00000010
,其结果将是00100010
.