十四章--icloud技术--之一

来源:互联网 发布:儿童编程机构加盟 编辑:程序博客网 时间:2024/05/03 05:10

到这一章就遇到困难了,用书上的代码运行不起来。先解释里面的一些基础代码,涉及到指针操作,c语言的基础还是不牢啊,咨询了我们这的一个大牛才看懂。

- (BOOL)stateAtRow:(NSUInteger)row column:(NSUInteger)column {
const char *bitmapBytes = [self.bitmap bytes];
char rowByte = bitmapBytes[row];
char result = (1 << column) & rowByte;
if (result != 0)
return YES;
else
return NO;
}

解释一下:bitmapBytes里面存的是0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80,这是初始状态,每一个字节表示每一行的列的状态,比如第一行是0x01,那么就是说第一行第一列是置为1,0x02表示第二行第二列被置为1,以此类推,形成的初始图就是



char result = (1 << column) & rowByte  这句话的意思是1左移column位再和rowByte进行与操作。


比较不好理解的是下面的操作

- (void)setState:(BOOL)state atRow:(NSUInteger)row column:(NSUInteger)column {
char *bitmapBytes = [self.bitmap mutableBytes];
char *rowByte = &bitmapBytes[row];
if (state)
*rowByte = *rowByte | (1 << column);
else
*rowByte = *rowByte & ~(1 << column);
}

这个方法是用来设置像素点是否为选中,这里面用指针进行移位操作,普及一下,*rowByte不是地址,是里面存放的字节(例如初始的0x01、0x02、0x04、0x08、0x10、0x20、0x40、0x80)

*rowByte = *rowByte | (1 << column)  这个就是说1往左column位移然后和rowByte里的第一个字节0x01进行或操作,例如我们点了第一行的第8列(从右往左是1到8),操作                                                                     过后就是0x81、0x02、0x04、0x08、0x10、0x20、0x40、0x80,如下图



0 0
原创粉丝点击