2011-03-02 38 views
1

嘿,我一直有一个C程序的麻烦。我必须编写的程序模拟VAX计算机的操作。我必须接受2个变量x和y来生成z。 内有两个功能,第一个按位C编程

  • 设置z为1其中z的y各比特位置= 1个
  • 第二组为0,其中的y各比特位置= 1

我并不是要求某人为我这样做,我只需要解释这是如何实现的,因为我有两个我需要的功能。我正在考虑这样的事情,但我不知道它是否正确。

#include<stdio.h> 

int main() 
{ 
    int x1 = 1010; 
    int y1 = 0101; 

    bis(x1, y1); 
    bic(x1, y1); 
} 

/* BIT SET function that sets the result to 1 wherever y = 1 */ 
int bis (int x, int y) 
{ 
    int z = x & y; 

    int result = ?; 
    printf("BIT SET: \n\n", result); 
    return result; 
} 

/* BIT CLEAR function that sets result to 0 wherever y = 1 */ 
int bic(int x, int y) 
{ 
    int z = x & y; 

    int result = ?; 
    printf("BIT CLEAR:\n\n ", result); 
    return result; 
} 

对穷人命名约定的道歉。无论如何,我在这个节目的正确轨道上?

+8

那些不是二进制数,'int y1 = 0101;'可能不是你认为的数字。 – Marlon 2011-03-02 22:33:45

+2

你可以对操作语义更精确一点吗?你是否熟悉按位或,而不是?我相信你所需要的可能只是'z = x | y;'(x或y)和'z = x&(〜y)'。 (x而不是y) – Zulan 2011-03-02 22:38:56

+0

我很抱歉没有正确地声明变量,我一直在做过去2周的按位操作,包括位移,但至于检查位位置,我从来没有触及那个或者是 ANDING会给我想要的结果吗?我很抱歉 ,但我有一些困难与逐位的东西 – PyGuy91 2011-03-02 22:45:27

回答

0

不...你在那里会有两个整数。其中一个是1010(基数10),另一个是101(基数8 - 八进制 - > 65基数10)。

首先,你会想要将你的常量声明为二进制(通过用0b作为前缀)。

第二,你会想把它们(对于你的教师或TA)作为二进制表示。退房this question for more ideas

+0

请注意,您可能会或可能不会遇到Two的补码表示形式的整数 - 这是很长的,因为我不得不担心这一点。 – BIBD 2011-03-02 22:45:23

+0

我认为用'Ob'作为常量的前缀不是标准的。尽管如此,GCC仍然支持它。 – fouronnes 2011-03-02 23:02:07

3

让我们先看看bitset()。我不会发布C代码,但我们可以在纸上解决这个问题。

假设你的整数具有以下位模式:x = 1011y = 0101。 (我正在改变你的例子中的数字,顺便说一下,这不是你如何定义两个具有这些位模式的整数,但现在我们将重点放在逻辑上。)

如果我理解正确,你打电话给bitset(x, y),你想答案Z是1111

x = 1011 
y = 0101 
    ^^-------- Because these two bits have the value 1, then your answer also 
       has to set them to 1 while leaving the other bits in x alone. 

那么,哪个按位操作可以实现这一点?您有AND(&),OR(\),XOR(^)和COMPLEMENT(~)。

在这种情况下,您正在对这两个值进行“或”运算。看下面的真值表:

x  1 0 1 1 
y  0 1 0 1 
----------------- 
(x OR y) 1 1 1 1 

最后一行中的每一位都是由x或y中的ORing给出的。因此,现在你可以写一个C函数bitset(x,y)= 1,(0 OR 1)= 1,(1 OR 0)= 1,(1 OR 1)= 1所以(1 OR 0)= 1, ,ORs x和y,并返回结果作为Z.

什么按位运算符 - 并且您可以使用多个运算符在多个步骤中执行 - 您将使用清零位吗?

       x 1 0 1 1 
           y 0 1 0 1 
------------------------------------------- 
(SOME OPERATONS INVOLVING x and y) 1 0 1 0 

这些逻辑运算符(来自上面的列表)是什么?考虑“和”和“补充”操作符。

祝你好运!

加成:C.

int x = 1337在表达整数A快速入门创建一个整数,并赋予它的价值1337。如果你说x = 01337,x不会像你所期望的那样具有值“1337”。通过将0放在数字的前面,您告诉C该数字是八进制数(以8为底)。在基数8中解释的数字“1337”等于十进制(基数10)735.如果你说x = 0x1337那么你表示基数16中的数字,作为十六进制数,相当于基数10中的4919.

+0

感谢rascher的回应。这是一个很大的帮助。我希望这与我的comp arch模块的这一部分一样艰难 – PyGuy91 2011-03-02 23:22:06