加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用“char”的布尔数组

发布时间:2020-12-16 10:42:37 所属栏目:百科 来源:网络整理
导读:我创建了一个实际上代表一个存储在char中的8个布尔数组的对象.我用它来学习更多关于按位运算符以及在C中创建自己的对象的内容.所以我有两个问题: 我是否可以确定以下代码 总是有效吗? 这是一个很好的实现 制作一个不会迷路的物体 在C中,除非你发布它 你自
我创建了一个实际上代表一个存储在char中的8个布尔数组的对象.我用它来学习更多关于按位运算符以及在C中创建自己的对象的内容.所以我有两个问题:

>我是否可以确定以下代码
总是有效吗?
>这是一个很好的实现
制作一个不会迷路的物体
在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语言.任何人都可以要求更多的“功课”,我可以提高自己吗?

谢谢,
ief2

解决方法

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的错误.这是不一致的.使错误报告统一,或者您的库的用户将进行错误检查.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读