2010-06-01 122 views
2

我想:十六进制斌逻辑运算后

111 || 100 ---> 111, not 1 
100 && 100 ---> 100, not 1 
101 && 010 ---> 000, not 0 

断码

#include <stdio.h> 

main(void){ 
     string hexa = 0xff; 
     strig hexa2 = 0xf1; 

     // CONVERT TO INT??? cast 
     int hexa3 = hexa || hexa2; 
     int hexa4 = hexa && hexa2; 

     puts(hexa3); 
     puts(hexa4); 
} 

回答

11

你想要的位运算符(|&),而不是逻辑运算符(||&&) :

110 | 011 --> 111 
110 & 101 --> 100 

至于你的断码的,你也有不正确的类型hexahexb这都应该是数字类型:

int hexa = 0xff; 
int hexa2 = 0xf1; 

最后,输出一个整数,你会用printf进行格式化:

printf("hexa3 = 0x%08x\n", heaxa3); // display as 8 digit, 0 padded hex 
+0

是的,但那些回到完整的二进制,不只是1或0. – otto 2010-06-01 22:50:22

+3

||和&&也是二元运算符。我认为你的意思是说“比特币”。 – sepp2k 2010-06-01 22:51:10

+0

@ sepp2k - 谢谢,我记得功能如何工作而不是他们的正确名称要好得多 – 2010-06-01 22:53:28

1
  1. string在这里不是正确的数据类型。数字0xff(二进制中的11111111)和字符串“0xff”之间有很大差异。我假设你想处理前者;将字符串解析为整数是它自己的完整主题。一个16位序列的好数据类型是unsigned int
  2. ||之间有很大的区别。和|。前者做一个所谓的“逻辑”,或者:它将两个操作数转换为布尔值,然后如果至少一个操作数为真,则返回true;否则返回false。如果操作数为0,则操作数转换为false,否则为true。因此,就你的例子而言,0xff和0xf1都被转换为true,并且true || true == true。这就是为什么您的代码打印1.

备注:即使对于布尔值,和|是不同的,因为短路:当你有a || b时,b只在a为假时被评估。两个参数的评估值为a | b。这很重要,即当两个操作数中的一个是具有副作用的函数调用时。

+0

+1,如果我有更多的积分。 – otto 2010-06-01 23:07:04

+1

“unsigned int”? – otto 2010-06-01 23:31:05