TCSH bit a bit | operador

0

Como eu uso o operador lógico ou bit a bit, |, em tcsh?

Eu entro

@ y = 1001; @ z = 0110;
@ x = $y|$z
110: Command not found.
    
por adiles 26.12.2013 / 06:38

2 respostas

2

Você realmente quer fazer isso apenas no tcsh? O Csh e seu derivado tcsh têm muitas dessas peculiaridades . Você está melhor com outro shell como o bash, etc.

Neste caso particular, parece que jogar um par de parênteses mantém o tcsh feliz. Isto também está documentado no manual do tcsh:

expr may contain the operators *, +, etc., as in C. If expr contains <, >, & or | then at least that part of expr must be placed within ().

mint13:~> echo $version
tcsh 6.17.06 (Astron) 2011-04-15 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,nd,color,filec
mint13:~> @ y = 1001; @ z = 0110;
mint13:~> @ x = $y|$z
110: Command not found.
mint13:~> @ x = ($y|$z)
mint13:~> echo $x
1007

Você já deve estar ciente disso - tcsh está lendo 1001 e 0110 como números decimais. Eu não sei como entender os números binários.

    
por 26.12.2013 / 08:33
0

Eu não sei como declarar números binários; mas sua sintaxe está errada.

O '@' tinha seu próprio analisador de expressões e de alguma forma confundia com o analisador primário se a expressão não fosse usada como parênteses. De acordo com o man-page, os espaços necessários em vários casos incluem os operadores bit a bit. Sugiro usar espaços em todos os lugares, uma vez que tinha muitos bugs lá.

Isso funcionará sem problemas:

@ y = 1001; @ z = 0110;
@ x = ( $y | $z ); echo $x

Observe que, como C, o número que começa com 0, são octais, então o valor de $ z é 72 em decimal.

Octais e hexadecimais são usados porque eles representam exatamente os números binários. Um dígito octal representa 3 dígitos binários.

binary <--> octal
   000         0
   001         1
   010         2
   011         3
   100         4
   101         5
   110         6
   111         7

Se y e z valores que você escreveu estão em binário, esta é a forma correta (usando octals)

@ y = 011; @z = 006;
@ x = ( $y | $z ); echo $x
15

Existe outra solução, use qualquer calculadora de linha de comando que você queira usando expressões com citações anteriores. Sugiro que tente calc , bc ou awk com este pedido.

Exemplo com calc:

set x = 'calc '0b1001 | 0b110''; echo $x
15

15 (dec) = 017 (oct) = 0xF (hex) = 0b1111 (bin)

    
por 27.06.2017 / 14:26