使用“char”的布尔数组
我创建了一个实际上代表一个存储在char中的8个布尔数组的对象.我用它来学习更多关于按位运算符以及在C中创建自己的对象的内容.所以我有两个问题:
>我是否可以确定以下代码 代码: /* * IEFBooleanArray.h * IEFBooleanArray * * Created by ief2 on 8/08/10. * Copyright 2010 ief2. All rights reserved. * */ #ifndef IEFBOOLEANARRAY_H #define IEFBOOLEANARRAY_H #include <stdlib.h> #include <string.h> #include <math.h> typedef char * IEFBooleanArrayRef; void IEFBooleanArrayCreate(IEFBooleanArrayRef *ref); void IEFBooleanArrayRelease(IEFBooleanArrayRef ref); int IEFBooleanArraySetBitAtIndex(IEFBooleanArrayRef ref,unsigned index,int flag); int IEFBooleanArrayGetBitAtIndex(IEFBooleanArrayRef ref,unsigned index); #endif /* * IEFBooleanArray.c * IEFBooleanArray * * Created by ief2 on 8/08/10. * Copyright 2010 ief2. All rights reserved. * */ #include "IEFBooleanArray.h" void IEFBooleanArrayCreate(IEFBooleanArrayRef *ref) { IEFBooleanArrayRef newReference; newReference = malloc(sizeof(char)); memset(newReference,sizeof(char)); *ref = newReference; } void IEFBooleanArrayRelease(IEFBooleanArrayRef ref) { free(ref); } int IEFBooleanArraySetBitAtIndex(IEFBooleanArrayRef ref,int flag) { int orignalStatus; if(index < 0 || index > 7) return -1; if(flag == 0) flag = 0; else flag = 1; orignalStatus = IEFBooleanArrayGetBitAtIndex(ref,index); if(orignalStatus == 0 && flag == 1) *ref = *ref + (int)pow(2,index); else if(orignalStatus == 1 && flag == 0) *ref = *ref - (int)pow(2,index); return 0; } int IEFBooleanArrayGetBitAtIndex(IEFBooleanArrayRef ref,unsigned index) { int result; int value; value = (int)pow(2,index); result = value & *ref; if(result == 0) return 0; else return 1; } 我更像是一个Objective-C家伙,但我真的想更多地学习C语言.任何人都可以要求更多的“功课”,我可以提高自己吗? 谢谢, 解决方法
pow(2,index)是产生位掩码的低效方法之一.我可以想象使用Ackermann函数可能会更糟,但pow()几乎是缓慢的.您应该使用(1<<索引).此外,C'ish设置/清除值的方式看起来不同.这是最近的一个问题:
> Simple way to set/unset an individual bit 如果你想以高效和便携的方式在C中使用munge,那么你真的应该看一下这个页面的位置,如果你以某种方式提到“位”,这里的每个人都会建议你: > http://graphics.stanford.edu/~seander/bithacks.html 以下代码序列: if(result == 0) return 0; else return 1; 可以写成return(result!= 0);,返回resultor return !! result(如果结果应强制为0或1).虽然明确表达意图总是一个好主意,但大多数C程序员更喜欢“结果结果”.因为在C中这是使你的意图清晰的方法. if看起来很不对劲,就像一个警告标签上写着“原始开发人员是一个Java人并且不了解位数”或其他东西. newReference = malloc(sizeof(char)); memset(newReference,sizeof(char)); malloc memset(x,z)== calloc(); 您有办法报告IEFBooleanArraySetBitAtIndex的错误(无效索引),但不报告IEFBooleanArrayGetBitAtIndex的错误.这是不一致的.使错误报告统一,或者您的库的用户将进行错误检查. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |