Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Bash: gesetztes Bit testen
View unanswered posts
View posts from last 24 hours
View posts from last 7 days

 
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum
View previous topic :: View next topic  
Author Message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3337
Location: de

PostPosted: Fri Jul 31, 2015 5:22 am    Post subject: Bash: gesetztes Bit testen Reply with quote

Guten Morgen,

ich bastel mir grad ein Wakeup-Script für meinen HTPC. VDR nutzt für den Aufnahmestatus eine Bitmaske:

1 - Timer ist aktiviert / deaktiviert
2 - Direktaufnahme (Record auf der Fernbedienung gedrückt)
4 - VPS
8 - VDR nimmt grad was auf.

Das geplante Script wird beim Runterfahren des Rechners ausgeführt. D.h. ich muss in der Bitmaske testen, ob Bit 1 gesetzt, Bit 2 und 8 nicht gesetzt sind. Die 4 ist egal.

Ausgeben kann man das auf die Art:
Code:
echo $((9 & 8))

würde eine 1 ausgeben, da ja bekanntermaßen die 8 in der 9 drinsteckt.

Mein bisheriger Versuch:
Code:

#!/bin/bash
is_active_timer()
{
    [ $(($1 & 0x1)) == 1 ] || return 1
    [ $(($1 & 0x2)) == 0 ] || return 1
    [ $(($1 & 0x8)) == 0 ] || return 1
    return 0
}


# main
while read TIMERS; do
    IFS=":"
    set -- $TIMERS
    echo "${1}"
    if is_active_timer "${1}" ; then
        echo "ja"
    else
        echo "nein"
    fi
    unset IFS
done < cat timers.conf


In meiner Funktion ist aber noch der Wurm drin. Hab da schon verschiedene Varianten durchgespielt, aber nur die erste Zeile klappt, d.h. Test auf das 1. Bit (von rechts).

Wie krieg ich das am elegantesten gebacken?
Back to top
View user's profile Send private message
mv
Watchman
Watchman


Joined: 20 Apr 2005
Posts: 6747

PostPosted: Fri Jul 31, 2015 3:37 pm    Post subject: Re: Bash: gesetztes Bit testen Reply with quote

musv wrote:
unset IFS

Das darf man nicht: Dadurch verliert IFS seine spezielle Bedeutung.
Back to top
View user's profile Send private message
mastacloak
Apprentice
Apprentice


Joined: 01 Aug 2004
Posts: 174
Location: Berlin / Germany

PostPosted: Fri Aug 14, 2015 11:34 pm    Post subject: Re: Bash: gesetztes Bit testen Reply with quote

musv wrote:

In meiner Funktion ist aber noch der Wurm drin. Hab da schon verschiedene Varianten durchgespielt, aber nur die erste Zeile klappt, d.h. Test auf das 1. Bit (von rechts).

Wie krieg ich das am elegantesten gebacken?


Was genau funktioniert denn nicht? Bei 1 (nur Bit 1 gesetzt 2^0=1) und 5 (Bit 1 und Bit 3 gesetzt 2^0+2^2=5), gibt deine Funktion als exit status 0 zurück, sonst 1.
Das ist doch laut deiner Beschreibung das was du wolltest, oder?

Hast du in deiner Beschreibung die Bitposition oder den Wert der Bitmaske angegeben?
Wenn du tatsächlich Bit 8 extrahieren wolltest, dann müsstest du mit 0x80 (dezimal 128) maskieren.
0x8 ist Bit 4.

Die Funktion is_active_timer() ist etwas umständlich und ineffizient. Sie ließe sich zusammenschrumpfen auf
Code:
is_active_timer() { ((($1 & 0xB) == 1)); }

aber es ging dir ja nicht unbedingt um Effizienz.
Back to top
View user's profile Send private message
toralf
Developer
Developer


Joined: 01 Feb 2004
Posts: 3922
Location: Hamburg

PostPosted: Sat Aug 15, 2015 1:03 pm    Post subject: Re: Bash: gesetztes Bit testen Reply with quote

musv wrote:

Code:
echo $((9 & 8))

würde eine 1 ausgeben, da ja bekanntermaßen die 8 in der 9 drinsteckt.

Code:
# echo $((9 & 8))
8
die 7, die steckt da auch noch drin usw !
:-D
Back to top
View user's profile Send private message
musv
Advocate
Advocate


Joined: 01 Dec 2002
Posts: 3337
Location: de

PostPosted: Sat Aug 15, 2015 2:23 pm    Post subject: Re: Bash: gesetztes Bit testen Reply with quote

toralf wrote:
die 7, die steckt da auch noch [in der 9] drin usw !
:-D

Nee, tut sie nicht. :P

Um das Forum aber mal an meinen weiteren Erkenntnissen teilhaben zu lassen:

Der Rückgabewert ist bei den Abfragen der Bits nicht, wie ich fälschlicherweise angenommen hab, immer 1 sondern entspricht dem zu prüfenden Bit. Also

Code:
echo $((6 & 2))
2


Meine Funktion hab ich dann so gebastelt:
Code:
is_active_timer()
{
    [[ $(echo $(($1 & 1))) == 1 ]] || return 1
    [[ $(echo $(($1 & 2))) -gt 0 ]] && return 1
    [[ $(echo $(($1 & 8))) -gt 0 ]] && return 1
    return 0
}
Back to top
View user's profile Send private message
toralf
Developer
Developer


Joined: 01 Feb 2004
Posts: 3922
Location: Hamburg

PostPosted: Sat Aug 15, 2015 3:51 pm    Post subject: Re: Bash: gesetztes Bit testen Reply with quote

musv wrote:
toralf wrote:
die 7, die steckt da auch noch [in der 9] drin usw !
:-D

Nee, tut sie nicht. :P
*prust* - da kam ich mit meiner Schadenfreude ja nicht weit - ich werd' mal wieder Binärdarstellung üben müssen.
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Deutsches Forum (German) Diskussionsforum All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum