2011-04-08 40 views
2
Not getting the char value: 
#define XL 33 
#define OR 113 
#define NOR 313 
#define TN 344 

int to_bits(int critn,char *mask) 
{ 
unsigned int x; 
int begin; 

if (critn < XL) begin = 1; 
else if (critn < OR) begin = XL; 
else if (critn < NOR) begin = OR; 
else if (critn <= TN) begin = NOR; 
else begin = 0; 
x = critn - begin; 

*mask = (char)(0x80 >> (x % 8)); 

return (int)(x >> 3); // fast divide by 8 
} 

对于该方法的解释和例子请参见 Explain the following C++ method转换(返回在Java多个值)

我写了下面的方法,在Java中:

ClassA{ 

final static int xl = 33; 
final static int or = 113; 
final static int nor = 313; 
final static int tn = 344; 

public int to_bits(int critn){ 
    int x; 
    int begin; 

    if(critn<xl) 
    begin = 1; 
    else if (critn<or) 
    begin = xl; 
    else if (critn<nor) 
    begin = or; 
    else if (critn<tn) 
    begin = nor; 
    else begin = 0; 

    x = critn - begin; 

    char mask = (char)(0x80 >> (x % 8)); 
    System.out.println(mask); 

    return (int)(x >> 3); 

} 


public static void main(String args[]){ 
    ClassA a =new ClassA(); 
    a.to_bits(312); 

} 

} 

我们可以采取屏蔽的输出入位集合对象。 我收到了把为(特殊字符输出的字符字段)

请建议还如何让这两个性格和整数值。谢谢

+1

@JavaBits:这是一个更好的问题,谢谢。 – 2011-04-08 13:37:55

+0

真的是你的问题:“我如何从一个函数返回多个项目?”。 – 2011-04-08 13:37:59

+0

是你的问题,“我如何改变这个以使to_bits返回一个[BitSet](http://download.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html)? – razlebe 2011-04-08 13:41:16

回答

2

你问你是否可以输出掩码为二进制?

如果是这样,这将做的工作:

System.out.println(Integer.toBinaryString(mask)); 

或十六进制:

System.out.println(Integer.toHexString(mask)); 

编辑 - 我以前说要用Integer.toString(mask, 2 /* or 16 */),但格式数量为签署...这显然让你感到困惑。)


您最终还会想知道从java方法调用中返回多个值。答案是返回数组(或对象)中的值;例如

return new int[]{(char)(0x80 >> (x % 8)), x >> 3}); 

或设置它们作为一个参数传递的可变数组或对象。


我有,你有没有意识到,char是Java中的16位类型的感觉。如果您想要的类型与C/C++ char等效,则最接近的是Java byte类型 - 一种带符号的8位类型。


在进一步思考,最简单的方法是做计算给你int值;例如

return new int[]{0x80 >> (x % 8), x >> 3}); 

并具有呼叫者铸造任一值,以如果需要一些其它类型的

假设这些值旨在用于按位操作,它们可能看起来为为负的事实是无关紧要的......假设位模式是正确的。请记住,它们是位模式而不是数字。如果出现混淆,请使用Integer.toHexString(...)Integer.toBinaryString(...)以无符号形式打印出来。

+0

非常感谢,但是因为它的类型签署了它的返回负号( - ) – JavaBits 2011-04-08 14:00:54

+0

如果它实际上是一个掩码,那么有一个负号的事实是不相关的,你并没有将它用作一个数字:你正在使用它作为一个位模式 – 2011-04-09 01:08:30

0

如果不考虑符号,这可能很有用。否则,我们可以坚持到字符。

// char mask =(char)(0x80 >>(x%8)); 字节掩码=(字节)(0x80 >>(x%8)); System.out.println(Integer.toString(mask,2));

输出:1 24

+0

感谢Stephen C. – JavaBits 2011-04-08 14:08:31

0

简短的回答是:没有办法返回多个值。

长的答案是:您可以将多个值放入一个值中。 如果您只想返回几个值并且所有值都是相同类型,请使用数组。 (请参阅Stephen C的回答) 否则使用一个对象。为您的情况:

class MaskAndBits { 
     char mask; 
     int bits; 
     public BitsAndMask(char mask, int bits) { 
     this.mask = mask; 
     this.bits = bits; 
     } 
} 

然后return new Whatever((char)(0x80 >> (x % 8));, (int)(x >> 3))。 总体来说这是比阵列解决方案类型更多,但它更难以 混合了返回的两个值;-)